From 9945ec321bc3a774318aeb32e884f7170a3fc5a7 Mon Sep 17 00:00:00 2001 From: Felipe Suero Date: Tue, 25 Apr 2023 10:00:29 -0400 Subject: [PATCH 1/7] why does this not work? --- .../src/context-providers/secrets.ts | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/languageserver/src/context-providers/secrets.ts b/languageserver/src/context-providers/secrets.ts index 6ee5d5b..a018429 100644 --- a/languageserver/src/context-providers/secrets.ts +++ b/languageserver/src/context-providers/secrets.ts @@ -1,15 +1,15 @@ -import {data, DescriptionDictionary} from "@actions/expressions"; -import {StringData} from "@actions/expressions/data/string"; -import {Mode} from "@actions/languageservice/context-providers/default"; -import {WorkflowContext} from "@actions/languageservice/context/workflow-context"; -import {warn} from "@actions/languageservice/log"; -import {isMapping, isString} from "@actions/workflow-parser"; -import {Octokit} from "@octokit/rest"; +import { data, DescriptionDictionary } from "@actions/expressions"; +import { StringData } from "@actions/expressions/data/string"; +import { Mode } from "@actions/languageservice/context-providers/default"; +import { WorkflowContext } from "@actions/languageservice/context/workflow-context"; +import { warn } from "@actions/languageservice/log"; +import { isMapping, isString } from "@actions/workflow-parser"; +import { Octokit } from "@octokit/rest"; -import {RepositoryContext} from "../initializationOptions"; -import {TTLCache} from "../utils/cache"; -import {errorStatus} from "../utils/error"; -import {getRepoPermission} from "../utils/repo-permission"; +import { RepositoryContext } from "../initializationOptions"; +import { TTLCache } from "../utils/cache"; +import { errorStatus } from "../utils/error"; +import { getRepoPermission } from "../utils/repo-permission"; export async function getSecrets( workflowContext: WorkflowContext, @@ -28,6 +28,8 @@ export async function getSecrets( } const eventsConfig = workflowContext?.template?.events; + const dynamicEnv = workflowContext?.template?.env + if (eventsConfig?.workflow_call) { // Unpredictable secrets may be passed in via a workflow_call trigger secretsContext.complete = false; @@ -38,6 +40,7 @@ export async function getSecrets( } let environmentName: string | undefined; + if (workflowContext?.job?.environment) { if (isString(workflowContext.job.environment)) { environmentName = workflowContext.job.environment.value; @@ -53,6 +56,25 @@ export async function getSecrets( } } + + let isDynamicEnv = false; + if (workflowContext.job?.environment && isMapping(workflowContext.job.environment)) { + for (const k of workflowContext.job.environment) { + // check if the value starts with ${{ + if (isString(k.value) && k.value.value.startsWith("${{")) { + isDynamicEnv = true; + } + } + } + + console.log(`isDynamicEnv: ${isDynamicEnv}`) + if (isDynamicEnv) { + secretsContext.complete = false; + if (mode === Mode.Validation) { + return secretsContext; + } + } + const secrets = await getRemoteSecrets(octokit, cache, repo, environmentName); // Build combined map of secrets @@ -171,7 +193,7 @@ async function fetchOrganizationSecrets(octokit: Octokit, repo: RepositoryContex } try { - const secrets: {name: string}[] = await octokit.paginate("GET /repos/{owner}/{repo}/actions/organization-secrets", { + const secrets: { name: string }[] = await octokit.paginate("GET /repos/{owner}/{repo}/actions/organization-secrets", { owner: repo.owner, repo: repo.name, per_page: 100 From c4d478d45930481df437fd7dc812960568067a99 Mon Sep 17 00:00:00 2001 From: Felipe Suero Date: Wed, 26 Apr 2023 11:57:08 -0400 Subject: [PATCH 2/7] commiting instead of stashing --- .../src/context-providers/secrets.ts | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/languageserver/src/context-providers/secrets.ts b/languageserver/src/context-providers/secrets.ts index a018429..a641f07 100644 --- a/languageserver/src/context-providers/secrets.ts +++ b/languageserver/src/context-providers/secrets.ts @@ -56,24 +56,29 @@ export async function getSecrets( } } + let isDynamicEnv = true; - let isDynamicEnv = false; - if (workflowContext.job?.environment && isMapping(workflowContext.job.environment)) { - for (const k of workflowContext.job.environment) { - // check if the value starts with ${{ - if (isString(k.value) && k.value.value.startsWith("${{")) { - isDynamicEnv = true; + if (workflowContext?.job?.environment) { + if (isMapping(workflowContext.job.environment)) { + for (const x of workflowContext.job.environment) { + if (isString(x.key) && x.key.value === "name") { + if (isString(x.value)) { + environmentName = x.value.value; + } else { + isDynamicEnv = true; + } + break; + } } } } console.log(`isDynamicEnv: ${isDynamicEnv}`) - if (isDynamicEnv) { - secretsContext.complete = false; - if (mode === Mode.Validation) { - return secretsContext; - } - } + console.log(`environmentName: ${environmentName}`) + // if (isDynamicEnv) { + secretsContext.complete = false; + return secretsContext; + // } const secrets = await getRemoteSecrets(octokit, cache, repo, environmentName); From 40c20d550471d499626f4b2b843ae34fcc8402b5 Mon Sep 17 00:00:00 2001 From: Felipe Suero Date: Tue, 2 May 2023 11:22:00 -0400 Subject: [PATCH 3/7] handle the edge-cases --- .../src/context-providers/secrets.ts | 25 +++---------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/languageserver/src/context-providers/secrets.ts b/languageserver/src/context-providers/secrets.ts index a641f07..365c423 100644 --- a/languageserver/src/context-providers/secrets.ts +++ b/languageserver/src/context-providers/secrets.ts @@ -45,40 +45,21 @@ export async function getSecrets( if (isString(workflowContext.job.environment)) { environmentName = workflowContext.job.environment.value; } else if (isMapping(workflowContext.job.environment)) { - for (const x of workflowContext.job.environment) { - if (isString(x.key) && x.key.value === "name") { - if (isString(x.value)) { - environmentName = x.value.value; - } - break; - } - } - } - } - - let isDynamicEnv = true; - - if (workflowContext?.job?.environment) { - if (isMapping(workflowContext.job.environment)) { for (const x of workflowContext.job.environment) { if (isString(x.key) && x.key.value === "name") { if (isString(x.value)) { environmentName = x.value.value; } else { - isDynamicEnv = true; + secretsContext.complete = false; } break; } } + } else { + secretsContext.complete = false; } } - console.log(`isDynamicEnv: ${isDynamicEnv}`) - console.log(`environmentName: ${environmentName}`) - // if (isDynamicEnv) { - secretsContext.complete = false; - return secretsContext; - // } const secrets = await getRemoteSecrets(octokit, cache, repo, environmentName); From 0bd67083ff20f83c29f1585905a6c527998c45aa Mon Sep 17 00:00:00 2001 From: Felipe Suero Date: Tue, 2 May 2023 11:23:48 -0400 Subject: [PATCH 4/7] add comments --- languageserver/src/context-providers/secrets.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/languageserver/src/context-providers/secrets.ts b/languageserver/src/context-providers/secrets.ts index 365c423..a5ea165 100644 --- a/languageserver/src/context-providers/secrets.ts +++ b/languageserver/src/context-providers/secrets.ts @@ -50,12 +50,15 @@ export async function getSecrets( if (isString(x.value)) { environmentName = x.value.value; } else { + // this means we have a dynamic enviornment, in those situations we + // want to make sure we skip doing secret validation secretsContext.complete = false; } break; } } } else { + // if the expression is something like environment: ${{ ... }} then we want to skip validation secretsContext.complete = false; } } From 58712f4d46b2f510206e3197949a343e44e484a5 Mon Sep 17 00:00:00 2001 From: Felipe Suero Date: Tue, 2 May 2023 11:43:07 -0400 Subject: [PATCH 5/7] prettify --- languageserver/src/context-providers/secrets.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/languageserver/src/context-providers/secrets.ts b/languageserver/src/context-providers/secrets.ts index a5ea165..d2bc6e1 100644 --- a/languageserver/src/context-providers/secrets.ts +++ b/languageserver/src/context-providers/secrets.ts @@ -28,7 +28,7 @@ export async function getSecrets( } const eventsConfig = workflowContext?.template?.events; - const dynamicEnv = workflowContext?.template?.env + const dynamicEnv = workflowContext?.template?.env; if (eventsConfig?.workflow_call) { // Unpredictable secrets may be passed in via a workflow_call trigger @@ -50,7 +50,7 @@ export async function getSecrets( if (isString(x.value)) { environmentName = x.value.value; } else { - // this means we have a dynamic enviornment, in those situations we + // this means we have a dynamic enviornment, in those situations we // want to make sure we skip doing secret validation secretsContext.complete = false; } @@ -58,12 +58,11 @@ export async function getSecrets( } } } else { - // if the expression is something like environment: ${{ ... }} then we want to skip validation + // if the expression is something like environment: ${{ ... }} then we want to skip validation secretsContext.complete = false; } } - const secrets = await getRemoteSecrets(octokit, cache, repo, environmentName); // Build combined map of secrets From eefd820cc5165a4607b0a701a6fd3f075985f3ea Mon Sep 17 00:00:00 2001 From: Felipe Suero Date: Tue, 2 May 2023 11:50:51 -0400 Subject: [PATCH 6/7] prettify --- .../src/context-providers/secrets.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/languageserver/src/context-providers/secrets.ts b/languageserver/src/context-providers/secrets.ts index d2bc6e1..5f94613 100644 --- a/languageserver/src/context-providers/secrets.ts +++ b/languageserver/src/context-providers/secrets.ts @@ -1,15 +1,15 @@ -import { data, DescriptionDictionary } from "@actions/expressions"; -import { StringData } from "@actions/expressions/data/string"; -import { Mode } from "@actions/languageservice/context-providers/default"; -import { WorkflowContext } from "@actions/languageservice/context/workflow-context"; -import { warn } from "@actions/languageservice/log"; -import { isMapping, isString } from "@actions/workflow-parser"; -import { Octokit } from "@octokit/rest"; +import {data, DescriptionDictionary} from "@actions/expressions"; +import {StringData} from "@actions/expressions/data/string"; +import {Mode} from "@actions/languageservice/context-providers/default"; +import {WorkflowContext} from "@actions/languageservice/context/workflow-context"; +import {warn} from "@actions/languageservice/log"; +import {isMapping, isString} from "@actions/workflow-parser"; +import {Octokit} from "@octokit/rest"; -import { RepositoryContext } from "../initializationOptions"; -import { TTLCache } from "../utils/cache"; -import { errorStatus } from "../utils/error"; -import { getRepoPermission } from "../utils/repo-permission"; +import {RepositoryContext} from "../initializationOptions"; +import {TTLCache} from "../utils/cache"; +import {errorStatus} from "../utils/error"; +import {getRepoPermission} from "../utils/repo-permission"; export async function getSecrets( workflowContext: WorkflowContext, @@ -181,7 +181,7 @@ async function fetchOrganizationSecrets(octokit: Octokit, repo: RepositoryContex } try { - const secrets: { name: string }[] = await octokit.paginate("GET /repos/{owner}/{repo}/actions/organization-secrets", { + const secrets: {name: string}[] = await octokit.paginate("GET /repos/{owner}/{repo}/actions/organization-secrets", { owner: repo.owner, repo: repo.name, per_page: 100 From 94451fa8f21ba4b7631e453e92dcd31e0bfa1411 Mon Sep 17 00:00:00 2001 From: Felipe Suero Date: Tue, 2 May 2023 14:57:24 -0400 Subject: [PATCH 7/7] nits --- languageserver/src/context-providers/secrets.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/languageserver/src/context-providers/secrets.ts b/languageserver/src/context-providers/secrets.ts index 5f94613..ebf96e2 100644 --- a/languageserver/src/context-providers/secrets.ts +++ b/languageserver/src/context-providers/secrets.ts @@ -28,7 +28,6 @@ export async function getSecrets( } const eventsConfig = workflowContext?.template?.events; - const dynamicEnv = workflowContext?.template?.env; if (eventsConfig?.workflow_call) { // Unpredictable secrets may be passed in via a workflow_call trigger