@exabugs/dynamodb-client 1.13.1 → 1.14.0
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.
- package/CHANGELOG.md +21 -0
- package/README.md +5 -15
- package/bin/dynamodb-access-check.js +6 -0
- package/dist/server/handler.cjs +3 -3
- package/dist/server/handler.cjs.map +1 -1
- package/dist/server/media-handler.cjs +2 -2
- package/dist/server/media-process-handler-dlq.cjs +2 -2
- package/dist/server/media-process-handler.cjs +2 -2
- package/dist/server/operations/parameterConverter.js +3 -3
- package/dist/server/operations/parameterConverter.js.map +1 -1
- package/dist/tools/dynamodb-access-check/allowlist.d.ts +39 -0
- package/dist/tools/dynamodb-access-check/allowlist.d.ts.map +1 -0
- package/dist/tools/dynamodb-access-check/allowlist.js +34 -0
- package/dist/tools/dynamodb-access-check/allowlist.js.map +1 -0
- package/dist/tools/dynamodb-access-check/check.d.ts +24 -0
- package/dist/tools/dynamodb-access-check/check.d.ts.map +1 -0
- package/dist/tools/dynamodb-access-check/check.js +40 -0
- package/dist/tools/dynamodb-access-check/check.js.map +1 -0
- package/dist/tools/dynamodb-access-check/cli.d.ts +10 -0
- package/dist/tools/dynamodb-access-check/cli.d.ts.map +1 -0
- package/dist/tools/dynamodb-access-check/cli.js +96 -0
- package/dist/tools/dynamodb-access-check/cli.js.map +1 -0
- package/dist/tools/dynamodb-access-check/forbidden.d.ts +15 -0
- package/dist/tools/dynamodb-access-check/forbidden.d.ts.map +1 -0
- package/dist/tools/dynamodb-access-check/forbidden.js +34 -0
- package/dist/tools/dynamodb-access-check/forbidden.js.map +1 -0
- package/dist/tools/dynamodb-access-check/glob.d.ts +8 -0
- package/dist/tools/dynamodb-access-check/glob.d.ts.map +1 -0
- package/dist/tools/dynamodb-access-check/glob.js +37 -0
- package/dist/tools/dynamodb-access-check/glob.js.map +1 -0
- package/dist/tools/dynamodb-access-check/index.d.ts +5 -0
- package/dist/tools/dynamodb-access-check/index.d.ts.map +1 -0
- package/dist/tools/dynamodb-access-check/index.js +4 -0
- package/dist/tools/dynamodb-access-check/index.js.map +1 -0
- package/dist/tools/dynamodb-access-check/run.d.ts +2 -0
- package/dist/tools/dynamodb-access-check/run.d.ts.map +1 -0
- package/dist/tools/dynamodb-access-check/run.js +3 -0
- package/dist/tools/dynamodb-access-check/run.js.map +1 -0
- package/dist/tools/dynamodb-access-check/scan.d.ts +25 -0
- package/dist/tools/dynamodb-access-check/scan.d.ts.map +1 -0
- package/dist/tools/dynamodb-access-check/scan.js +151 -0
- package/dist/tools/dynamodb-access-check/scan.js.map +1 -0
- package/dist/tools/eslint/index.d.ts +28 -0
- package/dist/tools/eslint/index.d.ts.map +1 -0
- package/dist/tools/eslint/index.js +34 -0
- package/dist/tools/eslint/index.js.map +1 -0
- package/docs/DYNAMODB_ACCESS.md +152 -0
- package/package.json +11 -11
- package/bin/dynamodb-mcp.js +0 -12
- package/dist/mcp/adapter.d.ts +0 -36
- package/dist/mcp/adapter.d.ts.map +0 -1
- package/dist/mcp/adapter.js +0 -213
- package/dist/mcp/adapter.js.map +0 -1
- package/dist/mcp/cli.d.ts +0 -2
- package/dist/mcp/cli.d.ts.map +0 -1
- package/dist/mcp/cli.js +0 -122
- package/dist/mcp/cli.js.map +0 -1
- package/dist/mcp/index.d.ts +0 -7
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/index.js +0 -6
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -18
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -127
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/tools/deleteMany.d.ts +0 -12
- package/dist/mcp/tools/deleteMany.d.ts.map +0 -1
- package/dist/mcp/tools/deleteMany.js +0 -24
- package/dist/mcp/tools/deleteMany.js.map +0 -1
- package/dist/mcp/tools/deleteOne.d.ts +0 -12
- package/dist/mcp/tools/deleteOne.d.ts.map +0 -1
- package/dist/mcp/tools/deleteOne.js +0 -24
- package/dist/mcp/tools/deleteOne.js.map +0 -1
- package/dist/mcp/tools/find.d.ts +0 -12
- package/dist/mcp/tools/find.d.ts.map +0 -1
- package/dist/mcp/tools/find.js +0 -56
- package/dist/mcp/tools/find.js.map +0 -1
- package/dist/mcp/tools/findMany.d.ts +0 -12
- package/dist/mcp/tools/findMany.d.ts.map +0 -1
- package/dist/mcp/tools/findMany.js +0 -28
- package/dist/mcp/tools/findMany.js.map +0 -1
- package/dist/mcp/tools/findManyReference.d.ts +0 -12
- package/dist/mcp/tools/findManyReference.d.ts.map +0 -1
- package/dist/mcp/tools/findManyReference.js +0 -32
- package/dist/mcp/tools/findManyReference.js.map +0 -1
- package/dist/mcp/tools/findOne.d.ts +0 -12
- package/dist/mcp/tools/findOne.d.ts.map +0 -1
- package/dist/mcp/tools/findOne.js +0 -24
- package/dist/mcp/tools/findOne.js.map +0 -1
- package/dist/mcp/tools/generated.d.ts +0 -11
- package/dist/mcp/tools/generated.d.ts.map +0 -1
- package/dist/mcp/tools/generated.js +0 -171
- package/dist/mcp/tools/generated.js.map +0 -1
- package/dist/mcp/tools/index.d.ts +0 -13
- package/dist/mcp/tools/index.d.ts.map +0 -1
- package/dist/mcp/tools/index.js +0 -29
- package/dist/mcp/tools/index.js.map +0 -1
- package/dist/mcp/tools/insertMany.d.ts +0 -12
- package/dist/mcp/tools/insertMany.d.ts.map +0 -1
- package/dist/mcp/tools/insertMany.js +0 -28
- package/dist/mcp/tools/insertMany.js.map +0 -1
- package/dist/mcp/tools/insertOne.d.ts +0 -12
- package/dist/mcp/tools/insertOne.d.ts.map +0 -1
- package/dist/mcp/tools/insertOne.js +0 -24
- package/dist/mcp/tools/insertOne.js.map +0 -1
- package/dist/mcp/tools/updateMany.d.ts +0 -12
- package/dist/mcp/tools/updateMany.d.ts.map +0 -1
- package/dist/mcp/tools/updateMany.js +0 -28
- package/dist/mcp/tools/updateMany.js.map +0 -1
- package/dist/mcp/tools/updateOne.d.ts +0 -12
- package/dist/mcp/tools/updateOne.d.ts.map +0 -1
- package/dist/mcp/tools/updateOne.js +0 -38
- package/dist/mcp/tools/updateOne.js.map +0 -1
- package/dist/mcp/types.d.ts +0 -50
- package/dist/mcp/types.d.ts.map +0 -1
- package/dist/mcp/types.js +0 -49
- package/dist/mcp/types.js.map +0 -1
|
@@ -54,7 +54,7 @@ export function convertFindOneParams(mongoParams) {
|
|
|
54
54
|
* @returns 内部形式のfindManyパラメータ
|
|
55
55
|
*/
|
|
56
56
|
export function convertFindManyParams(mongoParams) {
|
|
57
|
-
//
|
|
57
|
+
// idsが直接指定されている場合
|
|
58
58
|
if (mongoParams.ids !== undefined) {
|
|
59
59
|
return { ids: mongoParams.ids };
|
|
60
60
|
}
|
|
@@ -109,7 +109,7 @@ export function convertUpdateOneParams(mongoParams) {
|
|
|
109
109
|
else {
|
|
110
110
|
updateData = {};
|
|
111
111
|
}
|
|
112
|
-
//
|
|
112
|
+
// idが直接指定されている場合(優先)
|
|
113
113
|
const directId = 'id' in mongoParams && typeof mongoParams.id === 'string' ? mongoParams.id : undefined;
|
|
114
114
|
if (directId) {
|
|
115
115
|
return {
|
|
@@ -181,7 +181,7 @@ export function convertUpdateManyParams(mongoParams) {
|
|
|
181
181
|
* @throws {Error} idが指定されていない場合
|
|
182
182
|
*/
|
|
183
183
|
export function convertDeleteOneParams(mongoParams) {
|
|
184
|
-
//
|
|
184
|
+
// idが直接指定されている場合(優先)
|
|
185
185
|
const directId = 'id' in mongoParams && typeof mongoParams.id === 'string' ? mongoParams.id : undefined;
|
|
186
186
|
if (directId) {
|
|
187
187
|
return { id: directId };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameterConverter.js","sourceRoot":"","sources":["../../../src/server/operations/parameterConverter.ts"],"names":[],"mappings":"AAqEA;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAA4B;IAE5B,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,WAAW,CAAC;IAClD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEnD,MAAM,cAAc,GAA6C;QAC/D,MAAM;QACN,GAAG,CAAC,IAAI;YACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI;YAC9B,IAAI,EAAE;gBACJ,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;aAC1D;SACF,CAAC;QACJ,GAAG,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI;YAC1B,UAAU,EAAE;gBACV,GAAG,CAAC,KAAK,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBAChC,GAAG,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;aAChC;SACF,CAAC;QACF,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IAEF,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAA8B;IACjE,qBAAqB;IACrB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,kCAAkC;IAClC,MAAM,EAAE,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEzF,IAAI,EAAE,EAAE,CAAC;QACP,oBAAoB;QACpB,OAAO,EAAE,EAAE,EAAE,CAAC;IAChB,CAAC;IAED,yBAAyB;IACzB,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAA8B;IAClE,
|
|
1
|
+
{"version":3,"file":"parameterConverter.js","sourceRoot":"","sources":["../../../src/server/operations/parameterConverter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type AllowlistKind = 'permanent' | 'debt';
|
|
2
|
+
/**
|
|
3
|
+
* 許可リストのエントリ(3 リポジトリ共通の形式)。
|
|
4
|
+
* - コード: `file` のみ(glob 可。例: `src/server/**`)
|
|
5
|
+
* - Terraform: `file`(.tf のパス)と `terraform`(`aws_iam_role_policy.x` / `data.aws_iam_policy_document.y`)
|
|
6
|
+
*/
|
|
7
|
+
export interface AllowlistEntry {
|
|
8
|
+
file: string;
|
|
9
|
+
/** Terraform の resource / data の名前。あれば Terraform のエントリ */
|
|
10
|
+
terraform?: string;
|
|
11
|
+
kind: AllowlistKind;
|
|
12
|
+
reason: string;
|
|
13
|
+
/** kind が debt のとき必須: 解消の道筋 */
|
|
14
|
+
todo?: string;
|
|
15
|
+
/** `file` の glob から除くもの(ESLint でも同じ除外になる) */
|
|
16
|
+
exclude?: string[];
|
|
17
|
+
/** 検出した行(任意)。ずれていても警告だけ */
|
|
18
|
+
line?: number;
|
|
19
|
+
/**
|
|
20
|
+
* ESLint だけが検出する制限(利用側固有の patterns)に対する例外。
|
|
21
|
+
* CLI は import を検出できないので、「検出されない」警告を出さない。
|
|
22
|
+
*/
|
|
23
|
+
eslintOnly?: boolean;
|
|
24
|
+
notes?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface Allowlist {
|
|
27
|
+
entries: AllowlistEntry[];
|
|
28
|
+
}
|
|
29
|
+
/** 許可リストを読み、書式を検査する。不正なら、問題の一覧を返す */
|
|
30
|
+
export declare function loadAllowlist(path: string): {
|
|
31
|
+
allowlist: Allowlist;
|
|
32
|
+
problems: string[];
|
|
33
|
+
};
|
|
34
|
+
/** エントリが、検出(種別・ファイル・Terraform の名前)に当てはまるか */
|
|
35
|
+
export declare function entryMatches(entry: AllowlistEntry, found: {
|
|
36
|
+
file: string;
|
|
37
|
+
terraform?: string;
|
|
38
|
+
}): boolean;
|
|
39
|
+
//# sourceMappingURL=allowlist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowlist.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/allowlist.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC;AAEjD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,qCAAqC;AACrC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAmBxF;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAIT"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { matchesAny } from './glob.js';
|
|
3
|
+
/** 許可リストを読み、書式を検査する。不正なら、問題の一覧を返す */
|
|
4
|
+
export function loadAllowlist(path) {
|
|
5
|
+
const raw = JSON.parse(readFileSync(path, 'utf8'));
|
|
6
|
+
const problems = [];
|
|
7
|
+
if (!raw || !Array.isArray(raw.entries)) {
|
|
8
|
+
return { allowlist: { entries: [] }, problems: ['`entries` の配列が無い'] };
|
|
9
|
+
}
|
|
10
|
+
const entries = raw.entries;
|
|
11
|
+
entries.forEach((e, i) => {
|
|
12
|
+
const label = `entries[${i}] (${e?.file ?? '?'}${e?.terraform ? ` ${e.terraform}` : ''})`;
|
|
13
|
+
if (!e || typeof e.file !== 'string' || e.file === '')
|
|
14
|
+
problems.push(`${label}: file が無い`);
|
|
15
|
+
if (e.kind !== 'permanent' && e.kind !== 'debt') {
|
|
16
|
+
problems.push(`${label}: kind は permanent か debt`);
|
|
17
|
+
}
|
|
18
|
+
if (typeof e.reason !== 'string' || e.reason === '')
|
|
19
|
+
problems.push(`${label}: reason が無い`);
|
|
20
|
+
if (e.kind === 'debt' && (typeof e.todo !== 'string' || e.todo === '')) {
|
|
21
|
+
problems.push(`${label}: debt には todo が要る`);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
return { allowlist: { entries }, problems };
|
|
25
|
+
}
|
|
26
|
+
/** エントリが、検出(種別・ファイル・Terraform の名前)に当てはまるか */
|
|
27
|
+
export function entryMatches(entry, found) {
|
|
28
|
+
if ((entry.terraform !== undefined) !== (found.terraform !== undefined))
|
|
29
|
+
return false;
|
|
30
|
+
if (entry.terraform !== undefined && entry.terraform !== found.terraform)
|
|
31
|
+
return false;
|
|
32
|
+
return matchesAny([entry.file], found.file) && !matchesAny(entry.exclude ?? [], found.file);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=allowlist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowlist.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/allowlist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAiCvC,qCAAqC;AACrC,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA0B,CAAC;IAC5E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,OAA2B,CAAC;IAChD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,GAAG,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;QAC1F,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC;QAC3F,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,2BAA2B,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC;QAC3F,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC;YACvE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC;AAC9C,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,YAAY,CAC1B,KAAqB,EACrB,KAA2C;IAE3C,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACtF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACvF,OAAO,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Finding } from './scan.js';
|
|
2
|
+
export interface CheckOptions {
|
|
3
|
+
/** 相対パス(許可リストの file、src、tf、ignore)の基準 */
|
|
4
|
+
root: string;
|
|
5
|
+
allowlistPath: string;
|
|
6
|
+
/** 走査するソースのディレクトリ(root からの相対) */
|
|
7
|
+
src: string[];
|
|
8
|
+
/** 走査する Terraform のディレクトリ(root からの相対) */
|
|
9
|
+
tf: string[];
|
|
10
|
+
/** 走査から除く glob(root からの相対パスに対して) */
|
|
11
|
+
ignore: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface CheckResult {
|
|
14
|
+
/** 許可リストに無い検出、許可リストの書式の問題 */
|
|
15
|
+
violations: string[];
|
|
16
|
+
warnings: string[];
|
|
17
|
+
/** 許可リストにある検出のうち、負債のもの */
|
|
18
|
+
debts: Finding[];
|
|
19
|
+
found: number;
|
|
20
|
+
allowed: number;
|
|
21
|
+
}
|
|
22
|
+
/** 走査して、許可リストと照合する(出力はしない) */
|
|
23
|
+
export declare function runCheck(options: CheckOptions): CheckResult;
|
|
24
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,OAAO,EAA8B,MAAM,WAAW,CAAC;AAErE,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,yCAAyC;IACzC,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,oCAAoC;IACpC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0BAA0B;IAC1B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAUD,8BAA8B;AAC9B,wBAAgB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,WAAW,CAiC3D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { entryMatches, loadAllowlist } from './allowlist.js';
|
|
2
|
+
import { scanSources, scanTerraform } from './scan.js';
|
|
3
|
+
const describe = (f) => f.terraform
|
|
4
|
+
? `${f.file}:${f.line} ${f.terraform} [${f.detail}]`
|
|
5
|
+
: `${f.file}:${f.line} ${f.detail}`;
|
|
6
|
+
const entryLabel = (e) => e.terraform ? `${e.file} ${e.terraform}` : e.file;
|
|
7
|
+
/** 走査して、許可リストと照合する(出力はしない) */
|
|
8
|
+
export function runCheck(options) {
|
|
9
|
+
const { allowlist, problems } = loadAllowlist(options.allowlistPath);
|
|
10
|
+
const violations = problems.map((p) => `許可リストの書式が不正: ${p}`);
|
|
11
|
+
const warnings = [];
|
|
12
|
+
const code = scanSources(options.root, options.src, options.ignore);
|
|
13
|
+
const tf = scanTerraform(options.root, options.tf, options.ignore);
|
|
14
|
+
const found = [...code.findings, ...tf.findings];
|
|
15
|
+
const debts = [];
|
|
16
|
+
let allowed = 0;
|
|
17
|
+
for (const f of found) {
|
|
18
|
+
const entry = findEntry(allowlist, f);
|
|
19
|
+
if (!entry) {
|
|
20
|
+
violations.push(`許可リストに無い DynamoDB への直接アクセス: ${describe(f)}`);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
allowed++;
|
|
24
|
+
if (entry.kind === 'debt')
|
|
25
|
+
debts.push(f);
|
|
26
|
+
if (entry.line !== undefined && entry.line !== f.line) {
|
|
27
|
+
warnings.push(`行番号がずれている: ${entryLabel(entry)} (リスト ${entry.line} → 実際 ${f.line})`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
for (const e of allowlist.entries) {
|
|
31
|
+
if (!e.eslintOnly && !found.some((f) => entryMatches(e, f))) {
|
|
32
|
+
warnings.push(`許可リストにあるが検出されない(リストから消す): ${entryLabel(e)} [${e.kind}]`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { violations, warnings, debts, found: found.length, allowed };
|
|
36
|
+
}
|
|
37
|
+
function findEntry(allowlist, f) {
|
|
38
|
+
return allowlist.entries.find((e) => entryMatches(e, f));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type CheckOptions } from './check.js';
|
|
2
|
+
export interface CliIo {
|
|
3
|
+
out: (s: string) => void;
|
|
4
|
+
err: (s: string) => void;
|
|
5
|
+
}
|
|
6
|
+
/** 引数を解釈する。誤りは Error */
|
|
7
|
+
export declare function parseArgs(argv: string[]): CheckOptions;
|
|
8
|
+
/** CLI 本体。終了コードを返す(process.exit は bin が呼ぶ) */
|
|
9
|
+
export declare function main(argv: string[], io?: CliIo): number;
|
|
10
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAY,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1B;AAYD,wBAAwB;AACxB,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAgCtD;AAED,8CAA8C;AAC9C,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAE,KAAgD,GAAG,MAAM,CAsCjG"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { runCheck } from './check.js';
|
|
4
|
+
const USAGE = `使い方: dynamodb-access-check --allowlist <json> [--root <dir>] [--src <dir>...] [--tf <dir>...] [--ignore <glob>...]
|
|
5
|
+
|
|
6
|
+
--allowlist <path> 許可リストの JSON(必須)
|
|
7
|
+
--root <dir> 相対パスの基準(既定: カレントディレクトリ)
|
|
8
|
+
--src <dir>... 走査するソースのディレクトリ(既定: .)
|
|
9
|
+
--tf <dir>... 走査する Terraform のディレクトリ(既定: .)
|
|
10
|
+
--ignore <glob>... 走査から除く glob(root からの相対パス。例: '**/__tests__/**')
|
|
11
|
+
|
|
12
|
+
終了コード: 0=OK / 1=許可リストに無い違反 / 2=引数・読み込みの誤り`;
|
|
13
|
+
/** 引数を解釈する。誤りは Error */
|
|
14
|
+
export function parseArgs(argv) {
|
|
15
|
+
const multi = { '--src': [], '--tf': [], '--ignore': [] };
|
|
16
|
+
let allowlist;
|
|
17
|
+
let root = process.cwd();
|
|
18
|
+
let current;
|
|
19
|
+
for (let i = 0; i < argv.length; i++) {
|
|
20
|
+
const a = argv[i];
|
|
21
|
+
if (a === '--allowlist' || a === '--root') {
|
|
22
|
+
const v = argv[++i];
|
|
23
|
+
if (!v || v.startsWith('--'))
|
|
24
|
+
throw new Error(`${a} に値が要る`);
|
|
25
|
+
if (a === '--allowlist')
|
|
26
|
+
allowlist = v;
|
|
27
|
+
else
|
|
28
|
+
root = resolve(v);
|
|
29
|
+
current = undefined;
|
|
30
|
+
}
|
|
31
|
+
else if (a in multi) {
|
|
32
|
+
current = a;
|
|
33
|
+
}
|
|
34
|
+
else if (a.startsWith('--')) {
|
|
35
|
+
throw new Error(`未知の引数: ${a}`);
|
|
36
|
+
}
|
|
37
|
+
else if (current) {
|
|
38
|
+
multi[current].push(a); // 値は複数並べられる
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
throw new Error(`位置が不正な引数: ${a}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (!allowlist)
|
|
45
|
+
throw new Error('--allowlist が要る');
|
|
46
|
+
for (const k of ['--src', '--tf'])
|
|
47
|
+
if (multi[k].length === 0)
|
|
48
|
+
multi[k].push('.');
|
|
49
|
+
return {
|
|
50
|
+
root,
|
|
51
|
+
allowlistPath: resolve(allowlist),
|
|
52
|
+
src: multi['--src'],
|
|
53
|
+
tf: multi['--tf'],
|
|
54
|
+
ignore: multi['--ignore'],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** CLI 本体。終了コードを返す(process.exit は bin が呼ぶ) */
|
|
58
|
+
export function main(argv, io = { out: console.log, err: console.error }) {
|
|
59
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
60
|
+
io.out(USAGE);
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
let options;
|
|
64
|
+
try {
|
|
65
|
+
options = parseArgs(argv);
|
|
66
|
+
if (!existsSync(options.allowlistPath)) {
|
|
67
|
+
throw new Error(`許可リストが無い: ${options.allowlistPath}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
io.err(`${e.message}\n\n${USAGE}`);
|
|
72
|
+
return 2;
|
|
73
|
+
}
|
|
74
|
+
let result;
|
|
75
|
+
try {
|
|
76
|
+
result = runCheck(options);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
io.err(`検査を実行できない: ${e.message}`);
|
|
80
|
+
return 2;
|
|
81
|
+
}
|
|
82
|
+
for (const w of result.warnings)
|
|
83
|
+
io.err(`WARN: ${w}`);
|
|
84
|
+
for (const d of result.debts) {
|
|
85
|
+
io.out(`負債: ${d.file}:${d.line} ${d.terraform ?? d.detail}`);
|
|
86
|
+
}
|
|
87
|
+
if (result.violations.length > 0) {
|
|
88
|
+
for (const v of result.violations)
|
|
89
|
+
io.err(`NG: ${v}`);
|
|
90
|
+
io.err('\nDynamoDB の操作は Records(DynamoClient 経由)に限る。例外にするなら許可リストに理由つきで追加する。');
|
|
91
|
+
return 1;
|
|
92
|
+
}
|
|
93
|
+
io.out(`OK: DynamoDB への直接アクセスは許可リストの範囲内(検出 ${result.found} 件、負債 ${result.debts.length} 件)`);
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DynamoDB への直接アクセスとみなす import の定義(CLI と ESLint の共有設定の唯一の正本)。
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* このライブラリの内部で DynamoDB に触れるエントリポイント。
|
|
6
|
+
* 触れない `server/media/*`、`server/media-sign` は含めない(許可)。
|
|
7
|
+
*/
|
|
8
|
+
export declare const LIBRARY_INTERNAL_IMPORTS: readonly ["@exabugs/dynamodb-client/server", "@exabugs/dynamodb-client/server/handler", "@exabugs/dynamodb-client/server/media-handler", "@exabugs/dynamodb-client/server/media-process-handler", "@exabugs/dynamodb-client/server/media-process-handler-dlq"];
|
|
9
|
+
/** ESLint の `no-restricted-imports` の `paths` に使う、完全一致の禁止リスト */
|
|
10
|
+
export declare const FORBIDDEN_IMPORT_NAMES: readonly string[];
|
|
11
|
+
/** import の指定子が禁止のものか */
|
|
12
|
+
export declare function isForbiddenSpecifier(specifier: string): boolean;
|
|
13
|
+
/** aws-sdk v2 のグローバルな DynamoDB クライアント(`AWS` 名前空間の DynamoDB)を検出したときの表示 */
|
|
14
|
+
export declare const AWS_V2_DYNAMODB_LABEL = "aws-sdk v2 \u306E DynamoDB \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8";
|
|
15
|
+
//# sourceMappingURL=forbidden.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forbidden.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/forbidden.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;;GAGG;AACH,eAAO,MAAM,wBAAwB,gQAM3B,CAAC;AAEX,gEAAgE;AAChE,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAKnD,CAAC;AAEF,yBAAyB;AACzB,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAM/D;AAED,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,oEAAiC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DynamoDB への直接アクセスとみなす import の定義(CLI と ESLint の共有設定の唯一の正本)。
|
|
3
|
+
*/
|
|
4
|
+
/** AWS SDK の DynamoDB パッケージ(v3)。サブパスも含めて禁止 */
|
|
5
|
+
const AWS_SDK_V3 = /^@aws-sdk\/(?:client|lib|util)-dynamodb(?:\/.*)?$/;
|
|
6
|
+
/** aws-sdk v2 の DynamoDB クライアントを直接 import する形 */
|
|
7
|
+
const AWS_SDK_V2 = /^aws-sdk\/clients\/dynamodb(?:\/.*)?$/;
|
|
8
|
+
/**
|
|
9
|
+
* このライブラリの内部で DynamoDB に触れるエントリポイント。
|
|
10
|
+
* 触れない `server/media/*`、`server/media-sign` は含めない(許可)。
|
|
11
|
+
*/
|
|
12
|
+
export const LIBRARY_INTERNAL_IMPORTS = [
|
|
13
|
+
'@exabugs/dynamodb-client/server',
|
|
14
|
+
'@exabugs/dynamodb-client/server/handler',
|
|
15
|
+
'@exabugs/dynamodb-client/server/media-handler',
|
|
16
|
+
'@exabugs/dynamodb-client/server/media-process-handler',
|
|
17
|
+
'@exabugs/dynamodb-client/server/media-process-handler-dlq',
|
|
18
|
+
];
|
|
19
|
+
/** ESLint の `no-restricted-imports` の `paths` に使う、完全一致の禁止リスト */
|
|
20
|
+
export const FORBIDDEN_IMPORT_NAMES = [
|
|
21
|
+
'@aws-sdk/client-dynamodb',
|
|
22
|
+
'@aws-sdk/lib-dynamodb',
|
|
23
|
+
'@aws-sdk/util-dynamodb',
|
|
24
|
+
...LIBRARY_INTERNAL_IMPORTS,
|
|
25
|
+
];
|
|
26
|
+
/** import の指定子が禁止のものか */
|
|
27
|
+
export function isForbiddenSpecifier(specifier) {
|
|
28
|
+
return (AWS_SDK_V3.test(specifier) ||
|
|
29
|
+
AWS_SDK_V2.test(specifier) ||
|
|
30
|
+
LIBRARY_INTERNAL_IMPORTS.includes(specifier));
|
|
31
|
+
}
|
|
32
|
+
/** aws-sdk v2 のグローバルな DynamoDB クライアント(`AWS` 名前空間の DynamoDB)を検出したときの表示 */
|
|
33
|
+
export const AWS_V2_DYNAMODB_LABEL = 'aws-sdk v2 の DynamoDB クライアント';
|
|
34
|
+
//# sourceMappingURL=forbidden.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forbidden.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/forbidden.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,8CAA8C;AAC9C,MAAM,UAAU,GAAG,mDAAmD,CAAC;AAEvE,iDAAiD;AACjD,MAAM,UAAU,GAAG,uCAAuC,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,iCAAiC;IACjC,yCAAyC;IACzC,+CAA+C;IAC/C,uDAAuD;IACvD,2DAA2D;CACnD,CAAC;AAEX,gEAAgE;AAChE,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,0BAA0B;IAC1B,uBAAuB;IACvB,wBAAwB;IACxB,GAAG,wBAAwB;CAC5B,CAAC;AAEF,yBAAyB;AACzB,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,OAAO,CACL,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QACzB,wBAA8C,CAAC,QAAQ,CAAC,SAAS,CAAC,CACpE,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 最小限の glob(`**`、`*`、`?`)。依存を増やさないための自前実装。
|
|
3
|
+
* パスは `/` 区切りの、ルートからの相対パス。
|
|
4
|
+
*/
|
|
5
|
+
export declare function globToRegExp(glob: string): RegExp;
|
|
6
|
+
/** いずれかの glob に一致するか */
|
|
7
|
+
export declare function matchesAny(globs: readonly string[], path: string): boolean;
|
|
8
|
+
//# sourceMappingURL=glob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/glob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBjD;AAED,wBAAwB;AACxB,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 最小限の glob(`**`、`*`、`?`)。依存を増やさないための自前実装。
|
|
3
|
+
* パスは `/` 区切りの、ルートからの相対パス。
|
|
4
|
+
*/
|
|
5
|
+
export function globToRegExp(glob) {
|
|
6
|
+
let out = '';
|
|
7
|
+
for (let i = 0; i < glob.length; i++) {
|
|
8
|
+
const c = glob[i];
|
|
9
|
+
if (c === '*') {
|
|
10
|
+
if (glob[i + 1] === '*') {
|
|
11
|
+
if (glob[i + 2] === '/') {
|
|
12
|
+
out += '(?:.*/)?'; // `**/` は 0 個以上のディレクトリ
|
|
13
|
+
i += 2;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
out += '.*';
|
|
17
|
+
i += 1;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
out += '[^/]*';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else if (c === '?') {
|
|
25
|
+
out += '[^/]';
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
out += c.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return new RegExp(`^${out}$`);
|
|
32
|
+
}
|
|
33
|
+
/** いずれかの glob に一致するか */
|
|
34
|
+
export function matchesAny(globs, path) {
|
|
35
|
+
return globs.some((g) => globToRegExp(g).test(path));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/glob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACxB,GAAG,IAAI,UAAU,CAAC,CAAC,uBAAuB;oBAC1C,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,CAAC;oBACN,GAAG,IAAI,IAAI,CAAC;oBACZ,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,IAAI,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,GAAG,IAAI,MAAM,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,UAAU,CAAC,KAAwB,EAAE,IAAY;IAC/D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { type CheckOptions, type CheckResult, runCheck } from './check.js';
|
|
2
|
+
export { type Allowlist, type AllowlistEntry, type AllowlistKind } from './allowlist.js';
|
|
3
|
+
export { FORBIDDEN_IMPORT_NAMES, isForbiddenSpecifier } from './forbidden.js';
|
|
4
|
+
export { main, parseArgs } from './cli.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3E,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/run.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** 検出 1 件。`terraform` があれば IAM(Terraform)、なければコード */
|
|
2
|
+
export interface Finding {
|
|
3
|
+
file: string;
|
|
4
|
+
line: number;
|
|
5
|
+
/** 禁止された import の指定子 / aws-sdk v2 の検出 / dynamodb: の権限 */
|
|
6
|
+
detail: string;
|
|
7
|
+
terraform?: string;
|
|
8
|
+
}
|
|
9
|
+
/** 常に走査しないディレクトリ */
|
|
10
|
+
export declare const DEFAULT_IGNORED_DIRS: Set<string>;
|
|
11
|
+
/** dir 配下のファイルを集める(root からの相対パスを返す)。`ignore` の glob に一致するものは除く */
|
|
12
|
+
export declare function walkFiles(root: string, dirs: readonly string[], accept: (name: string) => boolean, ignore: readonly string[]): string[];
|
|
13
|
+
/** ソースから、禁止された import(と aws-sdk v2 の DynamoDB クライアント)を検出する */
|
|
14
|
+
export declare function scanSources(root: string, dirs: readonly string[], ignore: readonly string[]): {
|
|
15
|
+
findings: Finding[];
|
|
16
|
+
scanned: number;
|
|
17
|
+
};
|
|
18
|
+
/** 名前のないブロック(locals・module など)の検出に使う名前 */
|
|
19
|
+
export declare const TF_TOP_LEVEL = "(top-level)";
|
|
20
|
+
/** Terraform から、DynamoDB の権限(`dynamodb:*`、AWS 管理ポリシー)を持つブロックを検出する */
|
|
21
|
+
export declare function scanTerraform(root: string, dirs: readonly string[], ignore: readonly string[]): {
|
|
22
|
+
findings: Finding[];
|
|
23
|
+
scanned: number;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/scan.ts"],"names":[],"mappings":"AAMA,qDAAqD;AACrD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,oBAAoB;AACpB,eAAO,MAAM,oBAAoB,aAU/B,CAAC;AAIH,kEAAkE;AAClE,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,EACjC,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,MAAM,EAAE,CAoBV;AAQD,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE;;;EAiB3F;AAoCD,0CAA0C;AAC1C,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAE1C,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE;;;EAsC7F"}
|