pepr 0.38.3 → 0.39.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/cli/build.d.ts +1 -1
  2. package/dist/cli/build.d.ts.map +1 -1
  3. package/dist/cli/build.helpers.d.ts +19 -0
  4. package/dist/cli/build.helpers.d.ts.map +1 -0
  5. package/dist/cli/deploy.d.ts.map +1 -1
  6. package/dist/cli/format.d.ts.map +1 -1
  7. package/dist/cli/init/index.d.ts.map +1 -1
  8. package/dist/cli/init/templates.d.ts +6 -2
  9. package/dist/cli/init/templates.d.ts.map +1 -1
  10. package/dist/cli/monitor.d.ts.map +1 -1
  11. package/dist/cli.js +294 -229
  12. package/dist/controller.js +53 -31
  13. package/dist/lib/assets/deploy.d.ts.map +1 -1
  14. package/dist/lib/assets/helm.d.ts +1 -0
  15. package/dist/lib/assets/helm.d.ts.map +1 -1
  16. package/dist/lib/assets/index.d.ts +1 -1
  17. package/dist/lib/assets/index.d.ts.map +1 -1
  18. package/dist/lib/assets/rbac.d.ts +31 -4
  19. package/dist/lib/assets/rbac.d.ts.map +1 -1
  20. package/dist/lib/assets/yaml.d.ts +2 -2
  21. package/dist/lib/assets/yaml.d.ts.map +1 -1
  22. package/dist/lib/capability.d.ts +2 -8
  23. package/dist/lib/capability.d.ts.map +1 -1
  24. package/dist/lib/controller/store.d.ts +1 -5
  25. package/dist/lib/controller/store.d.ts.map +1 -1
  26. package/dist/lib/controller/storeCache.d.ts +11 -0
  27. package/dist/lib/controller/storeCache.d.ts.map +1 -0
  28. package/dist/lib/enums.d.ts +17 -0
  29. package/dist/lib/enums.d.ts.map +1 -0
  30. package/dist/lib/{adjudicators.d.ts → filter/adjudicators.d.ts} +23 -18
  31. package/dist/lib/filter/adjudicators.d.ts.map +1 -0
  32. package/dist/lib/{filter.d.ts → filter/filter.d.ts} +1 -1
  33. package/dist/lib/filter/filter.d.ts.map +1 -0
  34. package/dist/lib/helpers.d.ts +1 -2
  35. package/dist/lib/helpers.d.ts.map +1 -1
  36. package/dist/lib/k8s.d.ts +1 -1
  37. package/dist/lib/k8s.d.ts.map +1 -1
  38. package/dist/lib/logger.d.ts +4 -0
  39. package/dist/lib/logger.d.ts.map +1 -1
  40. package/dist/lib/metrics.d.ts.map +1 -1
  41. package/dist/lib/module.d.ts +5 -0
  42. package/dist/lib/module.d.ts.map +1 -1
  43. package/dist/lib/mutate-processor.d.ts.map +1 -1
  44. package/dist/lib/mutate-request.d.ts +1 -60
  45. package/dist/lib/mutate-request.d.ts.map +1 -1
  46. package/dist/lib/types.d.ts +8 -24
  47. package/dist/lib/types.d.ts.map +1 -1
  48. package/dist/lib/validate-request.d.ts.map +1 -1
  49. package/dist/lib/watch-processor.d.ts.map +1 -1
  50. package/dist/lib.js +236 -299
  51. package/dist/lib.js.map +4 -4
  52. package/dist/sdk/cosign.d.ts +18 -0
  53. package/dist/sdk/cosign.d.ts.map +1 -0
  54. package/dist/sdk/heredoc.d.ts +2 -0
  55. package/dist/sdk/heredoc.d.ts.map +1 -0
  56. package/dist/sdk/sdk.d.ts +1 -2
  57. package/dist/sdk/sdk.d.ts.map +1 -1
  58. package/package.json +12 -8
  59. package/src/cli/build.helpers.ts +28 -0
  60. package/src/cli/build.ts +124 -121
  61. package/src/cli/deploy.ts +27 -24
  62. package/src/cli/dev.ts +3 -3
  63. package/src/cli/format.ts +3 -6
  64. package/src/cli/init/index.ts +23 -19
  65. package/src/cli/monitor.ts +34 -36
  66. package/src/lib/assets/deploy.ts +12 -3
  67. package/src/lib/assets/helm.ts +14 -0
  68. package/src/lib/assets/index.ts +12 -8
  69. package/src/lib/assets/rbac.ts +69 -17
  70. package/src/lib/assets/webhooks.ts +1 -1
  71. package/src/lib/assets/yaml.ts +8 -4
  72. package/src/lib/capability.ts +7 -12
  73. package/src/lib/controller/index.ts +3 -3
  74. package/src/lib/controller/store.ts +42 -202
  75. package/src/lib/controller/storeCache.ts +63 -0
  76. package/src/lib/enums.ts +21 -0
  77. package/src/lib/{adjudicators.ts → filter/adjudicators.ts} +56 -31
  78. package/src/lib/{filter.ts → filter/filter.ts} +3 -2
  79. package/src/lib/finalizer.ts +1 -1
  80. package/src/lib/helpers.ts +19 -15
  81. package/src/lib/k8s.ts +2 -2
  82. package/src/lib/logger.ts +41 -0
  83. package/src/lib/metrics.ts +3 -1
  84. package/src/lib/module.ts +5 -0
  85. package/src/lib/mutate-processor.ts +14 -12
  86. package/src/lib/mutate-request.ts +4 -69
  87. package/src/lib/types.ts +9 -28
  88. package/src/lib/validate-processor.ts +1 -1
  89. package/src/lib/validate-request.ts +2 -1
  90. package/src/lib/watch-processor.ts +34 -20
  91. package/src/sdk/cosign.ts +327 -0
  92. package/src/sdk/heredoc.ts +36 -0
  93. package/src/sdk/sdk.ts +1 -2
  94. package/dist/lib/adjudicators.d.ts.map +0 -1
  95. package/dist/lib/filter.d.ts.map +0 -1
@@ -0,0 +1,327 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // SPDX-FileCopyrightText: 2023-Present The Pepr Authors
3
+
4
+ import { https } from "follow-redirects";
5
+ import { readFile, unlink } from "node:fs/promises";
6
+ import { createWriteStream } from "node:fs";
7
+ import * as crypto from "node:crypto";
8
+ import { PublicKeyDetails, TrustedRoot } from "@sigstore/protobuf-specs";
9
+ import { bundleFromJSON } from "@sigstore/bundle";
10
+ import { toSignedEntity, toTrustMaterial, Verifier } from "@sigstore/verify";
11
+
12
+ export enum MediaTypeDockerV2 {
13
+ Manifest = "application/vnd.docker.distribution.manifest.v2+json",
14
+ }
15
+
16
+ export enum MediaTypeOciV1 {
17
+ Manifest = "application/vnd.oci.image.manifest.v1+json",
18
+ Index = "application/vnd.oci.image.index.v1+json",
19
+ }
20
+
21
+ /* eslint-disable @typescript-eslint/no-explicit-any */
22
+ export async function head(
23
+ rawUrl: string,
24
+ mediaType: string,
25
+ optsParam: Record<string, any> = {},
26
+ ): Promise<any> {
27
+ const url = new URL(rawUrl);
28
+
29
+ return new Promise((resolve, reject) => {
30
+ const opts = {
31
+ protocol: url.protocol,
32
+ hostname: url.hostname,
33
+ port: url.port,
34
+ path: url.pathname,
35
+ method: "HEAD",
36
+ headers: { Accept: mediaType },
37
+ ...optsParam,
38
+ };
39
+
40
+ https
41
+ .request(opts, resp => {
42
+ const { statusCode } = resp;
43
+
44
+ let error;
45
+ if (!statusCode?.toString().startsWith("2") && !statusCode?.toString().startsWith("3")) {
46
+ reject(new Error(`err: status code: ${statusCode}: expected 2xx|3xx`));
47
+ error = true;
48
+ }
49
+
50
+ if (error) {
51
+ resp.resume();
52
+ return;
53
+ }
54
+
55
+ resp.setEncoding("utf8");
56
+
57
+ resp.on("data", () => {});
58
+
59
+ resp.on("end", () => {
60
+ resolve(resp.headers);
61
+ });
62
+ })
63
+ .on("error", e => reject(e))
64
+ .end();
65
+ });
66
+ }
67
+
68
+ /* eslint-disable @typescript-eslint/no-explicit-any */
69
+ export async function get(
70
+ rawUrl: string,
71
+ mediaType: string,
72
+ optsParam: Record<string, any> = {},
73
+ ): Promise<any> {
74
+ const url = new URL(rawUrl);
75
+
76
+ return new Promise((resolve, reject) => {
77
+ const opts = {
78
+ protocol: url.protocol,
79
+ hostname: url.hostname,
80
+ port: url.port,
81
+ path: url.pathname,
82
+ method: "GET",
83
+ headers: {
84
+ "User-Agent": "node",
85
+ Accept: mediaType,
86
+ },
87
+ ...optsParam,
88
+ };
89
+
90
+ https
91
+ .request(opts, resp => {
92
+ const { statusCode } = resp;
93
+
94
+ let error;
95
+
96
+ if (!statusCode?.toString().startsWith("2") && !statusCode?.toString().startsWith("3")) {
97
+ console.log(resp.headers);
98
+ reject(new Error(`err: status code: ${statusCode}: expected 2xx`));
99
+ error = true;
100
+ }
101
+
102
+ if (error) {
103
+ resp.resume();
104
+ return;
105
+ }
106
+
107
+ resp.setEncoding("utf8");
108
+
109
+ let raw = "";
110
+ resp.on("data", chunk => {
111
+ raw += chunk;
112
+ });
113
+ resp.on("end", () => {
114
+ try {
115
+ resolve({ head: resp.headers, body: raw });
116
+ } catch (e) {
117
+ reject(e);
118
+ }
119
+ });
120
+ })
121
+ .on("error", e => reject(e))
122
+ .end();
123
+ });
124
+ }
125
+
126
+ /* eslint-disable @typescript-eslint/no-explicit-any */
127
+ export async function download(
128
+ rawUrl: string,
129
+ localPath: string,
130
+ optsParam: Record<string, any> = {},
131
+ ): Promise<void> {
132
+ const url = new URL(rawUrl);
133
+
134
+ return new Promise((resolve, reject) => {
135
+ const opts = {
136
+ protocol: url.protocol,
137
+ hostname: url.hostname,
138
+ port: url.port,
139
+ path: url.pathname,
140
+ method: "GET",
141
+ headers: {
142
+ "User-Agent": "node",
143
+ Accept: "application/octet-stream",
144
+ },
145
+ ...optsParam,
146
+ };
147
+
148
+ https
149
+ .request(opts, resp => {
150
+ const { statusCode } = resp;
151
+
152
+ let error;
153
+
154
+ if (!statusCode?.toString().startsWith("2") && !statusCode?.toString().startsWith("3")) {
155
+ console.log(resp.headers);
156
+ reject(new Error(`err: status code: ${statusCode}: expected 2xx`));
157
+ error = true;
158
+ }
159
+
160
+ if (error) {
161
+ resp.resume();
162
+ return;
163
+ }
164
+
165
+ const ws = createWriteStream(localPath).on("finish", () => {
166
+ ws.close(() => resolve());
167
+ });
168
+
169
+ resp.pipe(ws);
170
+ })
171
+ .on("error", async err => {
172
+ await unlink(localPath);
173
+ reject(err);
174
+ })
175
+ .end();
176
+ });
177
+ }
178
+
179
+ //
180
+ // TODO: should support using certs too
181
+ //
182
+
183
+ /**
184
+ * Returns all containers in a pod
185
+ * @param {string} iref image reference
186
+ * @param {array} pubkeys list of paths to node crypto code signing pubkeys
187
+ * @returns {boolean} whether the iref was signed by a key in the pubkeys
188
+ */
189
+ export async function verifyImage(
190
+ iref: string,
191
+ pubkeys: string[],
192
+ tlsCrts?: string[],
193
+ ): Promise<boolean> {
194
+ const X: Record<string, any> = {};
195
+
196
+ // <host---> / <image----------------------->
197
+ // / <name---------------> : <tag->
198
+ // docker.io / library / hello-world : latest
199
+ //
200
+ // <host> / <image------------------------------------->
201
+ // / <name------------------------------> : <tag>
202
+ // ttl.sh / 5dad3c9b-7ccc-4115-be27-c9244e7c0e06 : 2000m
203
+
204
+ X.iref = {};
205
+ X.iref.raw = iref;
206
+ X.iref.host = iref.split("/")[0];
207
+ X.iref.image = iref.replace(`${X.iref.host}/`, "");
208
+ X.iref.tag = X.iref.image.split(":").at(-1);
209
+ X.iref.name = X.iref.image.replace(`:${X.iref.tag}`, "");
210
+
211
+ X.manifest = {
212
+ url: `https://${X.iref.host}/v2/${X.iref.name}/manifests/${X.iref.tag}`,
213
+ };
214
+
215
+ const supportsMediaType = async (url: string, mediaType: string) => {
216
+ return (await head(url, mediaType, { ca: tlsCrts }))["content-type"] === mediaType;
217
+ };
218
+
219
+ const canOciV1Manifest = async (manifestUrl: string) => {
220
+ return supportsMediaType(manifestUrl, MediaTypeOciV1.Manifest);
221
+ };
222
+
223
+ const canDockerV2Manifest = async (manifestUrl: string) => {
224
+ return supportsMediaType(manifestUrl, MediaTypeDockerV2.Manifest);
225
+ };
226
+
227
+ // prettier-ignore
228
+ const manifestResp =
229
+ await canOciV1Manifest(X.manifest.url) ? await get(X.manifest.url, MediaTypeOciV1.Manifest, {ca: tlsCrts}) :
230
+ await canDockerV2Manifest(X.manifest.url) ? await get(X.manifest.url, MediaTypeDockerV2.Manifest, {ca: tlsCrts}) :
231
+ (() => { throw "Can't pull image manifest with supported MediaType." })();
232
+ X.manifest.content = manifestResp.body;
233
+
234
+ X.manifest.digest = `sha256:${crypto
235
+ .createHash("sha256")
236
+ .update(X.manifest.content)
237
+ .digest("hex")
238
+ .toString()}`;
239
+
240
+ X.sig = {};
241
+ X.sig.tag = `${X.manifest.digest.replace(":", "-")}.sig`;
242
+ X.sig.triangulated = `${X.iref.host}/${X.iref.name}:${X.sig.tag}`;
243
+ X.sig.url = `https://${X.iref.host}/v2/${X.iref.name}/manifests/${X.sig.tag}`;
244
+
245
+ const sigManifestResp = await get(X.sig.url, MediaTypeOciV1.Manifest, { ca: tlsCrts });
246
+ X.sig.manifest = sigManifestResp.body;
247
+
248
+ const cosignSigLayer = JSON.parse(X.sig.manifest).layers.filter((f: any) =>
249
+ Object.hasOwn(f?.annotations, "dev.cosignproject.cosign/signature"),
250
+ )[0];
251
+
252
+ X.sig.blob = {};
253
+ X.sig.blob.digest = cosignSigLayer.digest;
254
+ X.sig.blob.signature = cosignSigLayer.annotations["dev.cosignproject.cosign/signature"];
255
+ X.sig.blob.url = `https://${X.iref.host}/v2/${X.iref.name}/blobs/${X.sig.blob.digest}`;
256
+
257
+ const sigBlobResp = await get(X.sig.blob.url, "application/octet-stream", { ca: tlsCrts });
258
+ X.sig.blob.content = sigBlobResp.body;
259
+
260
+ let verified = false;
261
+
262
+ for (const pubkey of pubkeys) {
263
+ // https://github.com/sigstore/sigstore-js/blob/main/packages/verify/src/__tests__/verifier.test.ts
264
+ const pubKeyRaw = await readFile(`${pubkey}`, { encoding: "utf8" });
265
+ const pubKey = crypto.createPublicKey({
266
+ key: pubKeyRaw,
267
+ format: "pem",
268
+ encoding: "utf-8",
269
+ });
270
+
271
+ const trustedRoot = {
272
+ tlogs: [],
273
+ ctlogs: [],
274
+ timestampAuthorities: [],
275
+ certificateAuthorities: [],
276
+ } as unknown as TrustedRoot;
277
+
278
+ const keys = {
279
+ hint: {
280
+ rawBytes: pubKey.export({ type: "spki", format: "der" }),
281
+ keyDetails: PublicKeyDetails.PKIX_ECDSA_P256_SHA_256,
282
+ },
283
+ };
284
+ const trustMaterial = toTrustMaterial(trustedRoot, keys);
285
+
286
+ const subject = new Verifier(trustMaterial, {
287
+ ctlogThreshold: 0,
288
+ tlogThreshold: 0,
289
+ tsaThreshold: 0,
290
+ });
291
+
292
+ const bundle = bundleFromJSON({
293
+ mediaType: "application/vnd.dev.sigstore.bundle+json;version=0.1",
294
+ verificationMaterial: {
295
+ publicKey: {
296
+ hint: "hint",
297
+ },
298
+ tlogEntries: [],
299
+ timestampVerificationData: {
300
+ rfc3161Timestamps: [],
301
+ },
302
+ },
303
+ messageSignature: {
304
+ messageDigest: {
305
+ algorithm: "SHA2_256",
306
+ digest: crypto.createHash("sha256").update(X.sig.blob.content).digest().toString(),
307
+ },
308
+ signature: X.sig.blob.signature,
309
+ },
310
+ });
311
+
312
+ const signedEntity = toSignedEntity(bundle, Buffer.from(X.sig.blob.content));
313
+
314
+ try {
315
+ subject.verify(signedEntity);
316
+ verified = true;
317
+ break;
318
+ } catch (e) {
319
+ if (e.message.includes("signature verification failed")) {
320
+ continue;
321
+ }
322
+ throw e;
323
+ }
324
+ }
325
+
326
+ return verified;
327
+ }
@@ -0,0 +1,36 @@
1
+ // Refs:
2
+ // - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates
3
+
4
+ export function heredoc(strings: TemplateStringsArray, ...values: string[]) {
5
+ // shuffle strings & expression values back together
6
+ const zipped = strings
7
+ .reduce((acc: string[], cur, idx) => {
8
+ acc.push(cur, values[idx] || "");
9
+ return acc;
10
+ }, [])
11
+ .filter(x => x);
12
+
13
+ // rebuild as line-oriented
14
+ const asLines = zipped.join("").split(/[\r\n]+/);
15
+
16
+ // strip whitespace-only first & last lines
17
+ asLines[0].trim().length === 0 ? asLines.shift() : null;
18
+ asLines.slice(-1)[0].trim().length === 0 ? asLines.pop() : null;
19
+
20
+ // find smallest indent
21
+ const indent = asLines.reduce((acc, cur) => {
22
+ const firstAt = cur.search(/\S/);
23
+ return Math.min(firstAt !== -1 ? firstAt : Number.POSITIVE_INFINITY, acc);
24
+ }, Number.POSITIVE_INFINITY);
25
+
26
+ // de-indent all lines
27
+ const snipped = asLines.map(line => {
28
+ if (line.length < indent) {
29
+ return "";
30
+ }
31
+ return line.slice(indent);
32
+ });
33
+
34
+ // rejoin into multiline string
35
+ return snipped.join("\n");
36
+ }
package/src/sdk/sdk.ts CHANGED
@@ -3,7 +3,6 @@
3
3
 
4
4
  import { PeprValidateRequest } from "../lib/validate-request";
5
5
  import { PeprMutateRequest } from "../lib/mutate-request";
6
- import { a } from "../lib";
7
6
  import { V1OwnerReference } from "@kubernetes/client-node";
8
7
  import { GenericKind } from "kubernetes-fluent-client";
9
8
  import { K8s, kind } from "kubernetes-fluent-client";
@@ -16,7 +15,7 @@ import Log from "../lib/logger";
16
15
  * @returns the list of containers in the pod
17
16
  */
18
17
  export function containers(
19
- request: PeprValidateRequest<a.Pod> | PeprMutateRequest<a.Pod>,
18
+ request: PeprValidateRequest<kind.Pod> | PeprMutateRequest<kind.Pod>,
20
19
  containerType?: "containers" | "initContainers" | "ephemeralContainers",
21
20
  ) {
22
21
  const containers = request.Raw.spec?.containers || [];
@@ -1 +0,0 @@
1
- {"version":3,"file":"adjudicators.d.ts","sourceRoot":"","sources":["../../src/lib/adjudicators.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/lib/filter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAa,MAAM,SAAS,CAAC;AAqC/D;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,gBAAgB,EACrB,oBAAoB,EAAE,MAAM,EAAE,EAC9B,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAC3B,MAAM,CA0FR"}