Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,9 @@
"https-proxy-agent": "^7.0.2",
"hyperlinker": "^1.0.0",
"ini": "^5.0.0",
"jose": "^5.0.0",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems like a relatively high-sensitivity dependency. It's good that we're working on using something more maintained.

Would you mind explaining why you're pulling in version 5.0.0 instead of the latest version? (It looks like 6.1.1 is the latest)?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for your response.
This article explains the topic very clearly.
https://dev.to/silentwatcher_95/why-you-should-delete-jsonwebtoken-in-2025-1o7n

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since v6 is ESM-only, it won’t run here.

Supported Versions

Version Security Fixes 🔑 Other Bug Fixes 🐞 New Features ⭐ Runtime and Module type
v6.x [Security Policy] Universal[^universal] ESM[^cjs]
v5.x [Security Policy] Universal[^universal] CJS + ESM
v4.x [Security Policy] Universal[^universal] CJS + ESM
v2.x [Security Policy] Node.js CJS

https://github.com/panva/jose

"json5": "^2.2.3",
"jsonpointer": "^5.0.0",
"jsonwebtoken": "^9.0.0",
"lodash.includes": "^4.3.0",
"lodash.isobject": "^3.0.2",
"lodash.mapvalues": "^4.6.0",
Expand Down
64 changes: 35 additions & 29 deletions source/platforms/github/comms/checks/githubAppSupport.ts
Original file line number Diff line number Diff line change
@@ -1,47 +1,53 @@
import * as jwt from "jsonwebtoken"
import { SignJWT, importPKCS8 } from "jose"
import fetch from "node-fetch"

const ALG = "RS256" as const
// Step 1

/** App ID + Signing Key = initial JWT to start auth process */
const jwtForGitHubAuth = (appID: string, key: string) => {
const now = Math.round(new Date().getTime() / 1000)
const expires: number = now + 300
const keyContent = key
const payload: object = {
exp: expires,
iat: now,
iss: appID,
}
export const jwtForGitHubAuth = async (appID: string, privateKeyPEM: string) => {
const key = await importPKCS8(privateKeyPEM, ALG)
const now = Math.floor(Date.now() / 1000)

const token = await new SignJWT({})
.setProtectedHeader({ alg: ALG })
.setIssuedAt(now)
.setExpirationTime(now + 300)
.setIssuer(appID)
.sign(key)

return jwt.sign(payload, keyContent, { algorithm: "RS256" })
return token
}

// Step 2 - Use App signed JWT to grab a per-installation

const requestAccessTokenForInstallation = (appID: string, installationID: number, key: string) => {
const apiUrl = process.env["DANGER_GITHUB_API_BASE_URL"]
? process.env["DANGER_GITHUB_API_BASE_URL"]
: "https://api.github.com"
const requestAccessTokenForInstallation = async (appID: string, installationID: number, privateKeyPEM: string) => {
const apiUrl = process.env["DANGER_GITHUB_API_BASE_URL"] ?? "https://api.github.com"
const url = `${apiUrl}/app/installations/${installationID}/access_tokens`
const headers = {
Accept: "application/vnd.github.machine-man-preview+json",
Authorization: `Bearer ${jwtForGitHubAuth(appID, key)}`,
}
return fetch(url, {
body: JSON.stringify({}),
headers,

const jwt = await jwtForGitHubAuth(appID, privateKeyPEM)

const res = await fetch(url, {
method: "POST",
headers: {
Accept: "application/vnd.github+json",
Authorization: `Bearer ${jwt}`,
"X-GitHub-Api-Version": "2022-11-28",
},
body: JSON.stringify({}),
})

return res
}

/** Generates a temporary access token for an app's installation, 5m long */
export const getAccessTokenForInstallation = async (appID: string, installationID: number, key: string) => {
const newToken = await requestAccessTokenForInstallation(appID, installationID, key)
const credentials = await newToken.json()
if (!newToken.ok) {
console.error(`Could not get an access token for ${installationID}`)
console.error(`GitHub returned: ${JSON.stringify(credentials)}`)
export const getAccessTokenForInstallation = async (appID: string, installationID: number, privateKeyPEM: string) => {
const res = await requestAccessTokenForInstallation(appID, installationID, privateKeyPEM)
const json = await res.json()
if (!res.ok) {
console.error(`Could not get an access token for installation ${installationID}`)
console.error(`GitHub returned: ${JSON.stringify(json)}`)
throw new Error(`GitHub API error: ${res.status} ${res.statusText}`)
}
return credentials.token as string
return json.token as string
}
74 changes: 7 additions & 67 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2477,11 +2477,6 @@ bser@2.1.1:
dependencies:
node-int64 "^0.4.0"

buffer-equal-constant-time@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==

buffer-from@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
Expand Down Expand Up @@ -3179,13 +3174,6 @@ eastasianwidth@^0.2.0:
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==

ecdsa-sig-formatter@1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
dependencies:
safe-buffer "^5.0.1"

electron-to-chromium@^1.5.73:
version "1.5.114"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.114.tgz#f2bb4fda80a7db4ea273565e75b0ebbe19af0ac3"
Expand Down Expand Up @@ -4828,6 +4816,11 @@ jest@^28.0.0:
import-local "^3.0.2"
jest-cli "^28.1.3"

jose@^5.0.0:
version "5.10.0"
resolved "https://registry.yarnpkg.com/jose/-/jose-5.10.0.tgz#c37346a099d6467c401351a9a0c2161e0f52c4be"
integrity sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==

js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
Expand Down Expand Up @@ -4936,39 +4929,6 @@ jsonpointer@^5.0.0:
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559"
integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==

jsonwebtoken@^9.0.0:
version "9.0.2"
resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3"
integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==
dependencies:
jws "^3.2.2"
lodash.includes "^4.3.0"
lodash.isboolean "^3.0.3"
lodash.isinteger "^4.0.4"
lodash.isnumber "^3.0.3"
lodash.isplainobject "^4.0.6"
lodash.isstring "^4.0.1"
lodash.once "^4.0.0"
ms "^2.1.1"
semver "^7.5.4"

jwa@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
dependencies:
buffer-equal-constant-time "1.0.1"
ecdsa-sig-formatter "1.0.11"
safe-buffer "^5.0.1"

jws@^3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
dependencies:
jwa "^1.4.1"
safe-buffer "^5.0.1"

keyv@^4.5.3:
version "4.5.4"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
Expand Down Expand Up @@ -5107,21 +5067,6 @@ lodash.includes@^4.3.0:
resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==

lodash.isboolean@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==

lodash.isinteger@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==

lodash.isnumber@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==

lodash.isobject@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d"
Expand Down Expand Up @@ -5152,11 +5097,6 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==

lodash.once@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==

lodash.uniqby@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302"
Expand Down Expand Up @@ -5376,7 +5316,7 @@ module-lookup-amd@^7.0.1:
requirejs "^2.3.5"
requirejs-config-file "^4.0.0"

ms@^2.1.1, ms@^2.1.3:
ms@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
Expand Down Expand Up @@ -6533,7 +6473,7 @@ semver@7.6.3:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==

semver@7.x, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3:
semver@7.x, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.6.0, semver@^7.6.3:
version "7.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
Expand Down