github-issue-tower-defence-management 1.197.0 → 1.197.2
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 +14 -0
- package/bin/adapter/entry-points/console/consoleDataDelivery.js +1 -20
- package/bin/adapter/entry-points/console/consoleDataDelivery.js.map +1 -1
- package/bin/adapter/entry-points/console/ui-dist/assets/{index-CYwLv9pf.js → index-lT5OKx7e.js} +2 -2
- package/bin/adapter/entry-points/console/ui-dist/index.html +1 -1
- package/bin/adapter/entry-points/console/webServer.js +5 -0
- package/bin/adapter/entry-points/console/webServer.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/console/consoleDataDelivery.test.ts +12 -6
- package/src/adapter/entry-points/console/consoleDataDelivery.ts +1 -31
- package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.test.ts +30 -18
- package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.ts +12 -3
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +3 -1
- package/src/adapter/entry-points/console/ui-dist/assets/{index-CYwLv9pf.js → index-lT5OKx7e.js} +2 -2
- package/src/adapter/entry-points/console/ui-dist/index.html +1 -1
- package/src/adapter/entry-points/console/webServer.test.ts +78 -11
- package/src/adapter/entry-points/console/webServer.ts +9 -0
- package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +2 -2
- package/types/adapter/entry-points/console/consoleDataDelivery.d.ts.map +1 -1
- package/types/adapter/entry-points/console/webServer.d.ts.map +1 -1
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>TDPM Console</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-lT5OKx7e.js"></script>
|
|
8
8
|
<link rel="stylesheet" crossorigin href="/assets/index-CLHvrafO.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
@@ -545,7 +545,7 @@ describe('webServer new routes integration', () => {
|
|
|
545
545
|
},
|
|
546
546
|
});
|
|
547
547
|
|
|
548
|
-
it('serves a data list file
|
|
548
|
+
it('serves a data list file through the token gate without done filtering', async () => {
|
|
549
549
|
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'console-server-'));
|
|
550
550
|
const dataDir = path.join(tmpDir, 'data');
|
|
551
551
|
const listDir = path.join(dataDir, 'acme', 'prs');
|
|
@@ -554,12 +554,15 @@ describe('webServer new routes integration', () => {
|
|
|
554
554
|
path.join(listDir, 'list.json'),
|
|
555
555
|
JSON.stringify({
|
|
556
556
|
pjcode: 'acme',
|
|
557
|
-
items: [
|
|
557
|
+
items: [
|
|
558
|
+
{ projectItemId: 'PVTI_keep' },
|
|
559
|
+
{ projectItemId: 'PVTI_also_keep' },
|
|
560
|
+
],
|
|
558
561
|
}),
|
|
559
562
|
);
|
|
560
563
|
fs.writeFileSync(
|
|
561
564
|
path.join(listDir, '.done.json'),
|
|
562
|
-
JSON.stringify({ projectItemIds: ['
|
|
565
|
+
JSON.stringify({ projectItemIds: ['PVTI_also_keep'] }),
|
|
563
566
|
);
|
|
564
567
|
const server = await startWebServer({
|
|
565
568
|
accessToken: testToken,
|
|
@@ -588,7 +591,10 @@ describe('webServer new routes integration', () => {
|
|
|
588
591
|
const parsed: unknown = JSON.parse(authorized.body);
|
|
589
592
|
expect(parsed).toEqual({
|
|
590
593
|
pjcode: 'acme',
|
|
591
|
-
items: [
|
|
594
|
+
items: [
|
|
595
|
+
{ projectItemId: 'PVTI_keep' },
|
|
596
|
+
{ projectItemId: 'PVTI_also_keep' },
|
|
597
|
+
],
|
|
592
598
|
});
|
|
593
599
|
} finally {
|
|
594
600
|
await closeServer(server);
|
|
@@ -1493,6 +1499,7 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1493
1499
|
server: http.Server,
|
|
1494
1500
|
requestPath: string,
|
|
1495
1501
|
method = 'GET',
|
|
1502
|
+
headers?: Record<string, string>,
|
|
1496
1503
|
): Promise<{
|
|
1497
1504
|
statusCode: number;
|
|
1498
1505
|
body: string;
|
|
@@ -1508,7 +1515,7 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1508
1515
|
const port = address.port;
|
|
1509
1516
|
return new Promise((resolve, reject) => {
|
|
1510
1517
|
const httpRequest = http.request(
|
|
1511
|
-
{ host: '127.0.0.1', port, path: requestPath, method },
|
|
1518
|
+
{ host: '127.0.0.1', port, path: requestPath, method, headers },
|
|
1512
1519
|
(response) => {
|
|
1513
1520
|
const chunks: Uint8Array[] = [];
|
|
1514
1521
|
response.on('data', (chunk: Uint8Array) => chunks.push(chunk));
|
|
@@ -1647,7 +1654,7 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1647
1654
|
dashboardDataDir: dataDir,
|
|
1648
1655
|
});
|
|
1649
1656
|
try {
|
|
1650
|
-
const response = await requestServer(server,
|
|
1657
|
+
const response = await requestServer(server, `/tdpm.txt?k=${testToken}`);
|
|
1651
1658
|
expect(response.statusCode).toBe(200);
|
|
1652
1659
|
expect(response.body).toBe(expectedComposed);
|
|
1653
1660
|
expect(response.contentType).toBe('text/html; charset=utf-8');
|
|
@@ -1674,7 +1681,7 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1674
1681
|
dashboardDataDir: null,
|
|
1675
1682
|
});
|
|
1676
1683
|
try {
|
|
1677
|
-
const response = await requestServer(server,
|
|
1684
|
+
const response = await requestServer(server, `/tdpm.txt?k=${testToken}`);
|
|
1678
1685
|
expect(response.statusCode).toBe(200);
|
|
1679
1686
|
expect(response.body).toBe(staticDashboardRaw);
|
|
1680
1687
|
expect(response.contentType).toBe('text/html; charset=utf-8');
|
|
@@ -1700,7 +1707,7 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1700
1707
|
dashboardDataDir: dataDir,
|
|
1701
1708
|
});
|
|
1702
1709
|
try {
|
|
1703
|
-
const response = await requestServer(server,
|
|
1710
|
+
const response = await requestServer(server, `/tdpm.txt?k=${testToken}`);
|
|
1704
1711
|
expect(response.statusCode).toBe(200);
|
|
1705
1712
|
expect(response.body).toBe(staticDashboardRaw);
|
|
1706
1713
|
} finally {
|
|
@@ -1733,7 +1740,7 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1733
1740
|
dashboardDataDir: dataDir,
|
|
1734
1741
|
});
|
|
1735
1742
|
try {
|
|
1736
|
-
const response = await requestServer(server,
|
|
1743
|
+
const response = await requestServer(server, `/tdpm.txt?k=${testToken}`);
|
|
1737
1744
|
expect(response.statusCode).toBe(200);
|
|
1738
1745
|
expect(response.body).toBe(staticDashboardRaw);
|
|
1739
1746
|
} finally {
|
|
@@ -1753,7 +1760,7 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1753
1760
|
dashboardDataDir: null,
|
|
1754
1761
|
});
|
|
1755
1762
|
try {
|
|
1756
|
-
const response = await requestServer(server,
|
|
1763
|
+
const response = await requestServer(server, `/tdpm.txt?k=${testToken}`);
|
|
1757
1764
|
expect(response.statusCode).toBe(404);
|
|
1758
1765
|
} finally {
|
|
1759
1766
|
await closeServer(server);
|
|
@@ -1768,7 +1775,7 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1768
1775
|
dashboardDataDir: null,
|
|
1769
1776
|
});
|
|
1770
1777
|
try {
|
|
1771
|
-
const response = await requestServer(server,
|
|
1778
|
+
const response = await requestServer(server, `/tdpm.txt?k=${testToken}`);
|
|
1772
1779
|
expect(response.statusCode).toBe(404);
|
|
1773
1780
|
} finally {
|
|
1774
1781
|
await closeServer(server);
|
|
@@ -1797,6 +1804,66 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1797
1804
|
fs.rmSync(staticDir, { recursive: true, force: true });
|
|
1798
1805
|
}
|
|
1799
1806
|
});
|
|
1807
|
+
|
|
1808
|
+
it('returns 401 for GET /tdpm.txt without a token', async () => {
|
|
1809
|
+
const staticDir = fs.mkdtempSync(
|
|
1810
|
+
path.join(os.tmpdir(), 'dashboard-static-'),
|
|
1811
|
+
);
|
|
1812
|
+
writeStaticDashboard(staticDir);
|
|
1813
|
+
const { server, tmpDir } = await startServer({
|
|
1814
|
+
dashboardDir: staticDir,
|
|
1815
|
+
dashboardDataDir: null,
|
|
1816
|
+
});
|
|
1817
|
+
try {
|
|
1818
|
+
const response = await requestServer(server, '/tdpm.txt');
|
|
1819
|
+
expect(response.statusCode).toBe(401);
|
|
1820
|
+
} finally {
|
|
1821
|
+
await closeServer(server);
|
|
1822
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
1823
|
+
fs.rmSync(staticDir, { recursive: true, force: true });
|
|
1824
|
+
}
|
|
1825
|
+
});
|
|
1826
|
+
|
|
1827
|
+
it('returns 401 for GET /tdpm.txt with wrong token via query param', async () => {
|
|
1828
|
+
const staticDir = fs.mkdtempSync(
|
|
1829
|
+
path.join(os.tmpdir(), 'dashboard-static-'),
|
|
1830
|
+
);
|
|
1831
|
+
writeStaticDashboard(staticDir);
|
|
1832
|
+
const { server, tmpDir } = await startServer({
|
|
1833
|
+
dashboardDir: staticDir,
|
|
1834
|
+
dashboardDataDir: null,
|
|
1835
|
+
});
|
|
1836
|
+
try {
|
|
1837
|
+
const response = await requestServer(server, '/tdpm.txt?k=wrong-token');
|
|
1838
|
+
expect(response.statusCode).toBe(401);
|
|
1839
|
+
} finally {
|
|
1840
|
+
await closeServer(server);
|
|
1841
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
1842
|
+
fs.rmSync(staticDir, { recursive: true, force: true });
|
|
1843
|
+
}
|
|
1844
|
+
});
|
|
1845
|
+
|
|
1846
|
+
it('returns 200 for GET /tdpm.txt with valid token via x-pv-token header', async () => {
|
|
1847
|
+
const staticDir = fs.mkdtempSync(
|
|
1848
|
+
path.join(os.tmpdir(), 'dashboard-static-'),
|
|
1849
|
+
);
|
|
1850
|
+
writeStaticDashboard(staticDir);
|
|
1851
|
+
const { server, tmpDir } = await startServer({
|
|
1852
|
+
dashboardDir: staticDir,
|
|
1853
|
+
dashboardDataDir: null,
|
|
1854
|
+
});
|
|
1855
|
+
try {
|
|
1856
|
+
const response = await requestServer(server, '/tdpm.txt', 'GET', {
|
|
1857
|
+
[CONSOLE_TOKEN_HEADER]: testToken,
|
|
1858
|
+
});
|
|
1859
|
+
expect(response.statusCode).toBe(200);
|
|
1860
|
+
expect(response.body).toBe(staticDashboardRaw);
|
|
1861
|
+
} finally {
|
|
1862
|
+
await closeServer(server);
|
|
1863
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
1864
|
+
fs.rmSync(staticDir, { recursive: true, force: true });
|
|
1865
|
+
}
|
|
1866
|
+
});
|
|
1800
1867
|
});
|
|
1801
1868
|
|
|
1802
1869
|
describe('webServer image proxy', () => {
|
|
@@ -791,6 +791,15 @@ export const handleWebRequest = async (
|
|
|
791
791
|
sendNotFound(response);
|
|
792
792
|
return;
|
|
793
793
|
}
|
|
794
|
+
const providedToken = extractProvidedToken(
|
|
795
|
+
requestUrl.searchParams.get('k'),
|
|
796
|
+
request.headers[CONSOLE_TOKEN_HEADER],
|
|
797
|
+
extractCookieToken(request.headers.cookie),
|
|
798
|
+
);
|
|
799
|
+
if (!isTokenValid(options.accessToken, providedToken)) {
|
|
800
|
+
sendUnauthorized(response);
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
794
803
|
const dashboardContent = resolveDashboardContent(options, requestPath);
|
|
795
804
|
if (dashboardContent === null) {
|
|
796
805
|
sendNotFound(response);
|
|
@@ -312,12 +312,12 @@ describe('writeConsoleLists', () => {
|
|
|
312
312
|
expect(todoByHumanServedItemCount()).toBe(1);
|
|
313
313
|
});
|
|
314
314
|
|
|
315
|
-
it('
|
|
315
|
+
it('serves an item regardless of a done record accumulated between regenerations', () => {
|
|
316
316
|
regenerateTodoByHuman();
|
|
317
317
|
expect(todoByHumanServedItemCount()).toBe(1);
|
|
318
318
|
|
|
319
319
|
recordDoneProjectItemId(outDir, 'demo', 'todo-by-human', 'item-1');
|
|
320
|
-
expect(todoByHumanServedItemCount()).toBe(
|
|
320
|
+
expect(todoByHumanServedItemCount()).toBe(1);
|
|
321
321
|
|
|
322
322
|
regenerateTodoByHuman();
|
|
323
323
|
expect(todoByHumanServedItemCount()).toBe(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consoleDataDelivery.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleDataDelivery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"consoleDataDelivery.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleDataDelivery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAO9D,eAAO,MAAM,qBAAqB,GAChC,aAAa,MAAM,KAClB,gBAAgB,GAAG,IAoCrB,CAAC;AAmBF,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,sBAAsB,MAAM,EAC5B,OAAO,gBAAgB,KACtB,mBAuCF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webServer.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/webServer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"webServer.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/webServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,uEAAuE,CAAC;AAClH,OAAO,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,+DAA+D,CAAC;AAClG,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAM3D,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EAQvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,8BAA8B,EAE9B,sBAAsB,EACtB,gCAAgC,EAChC,sBAAsB,EAWvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAqB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EACL,0BAA0B,EAE3B,MAAM,8BAA8B,CAAC;AAUtC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAEjD,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAoC/C,eAAO,MAAM,aAAa,GAAI,aAAa,MAAM,KAAG,OAGiB,CAAC;AAEtE,eAAO,MAAM,aAAa,GAAI,aAAa,MAAM,KAAG,OAIH,CAAC;AAIlD,eAAO,MAAM,iBAAiB,GAAI,aAAa,MAAM,KAAG,OAmBvD,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,eAAe,MAAM,EACrB,eAAe,MAAM,GAAG,IAAI,KAC3B,OAAoE,CAAC;AAExE,eAAO,MAAM,kBAAkB,GAC7B,cAAc,MAAM,GAAG,SAAS,KAC/B,MAAM,GAAG,IAoBX,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,YAAY,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,EACpC,aAAa,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,EAC1C,aAAa,MAAM,GAAG,IAAI,KACzB,MAAM,GAAG,IAWX,CAAC;AAEF,eAAO,MAAM,oCAAoC,QAAqB,CAAC;AAEvE,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,MAC2F,CAAC;AAE7I,eAAO,MAAM,oBAAoB,GAAI,YAAY,GAAG,KAAG,MAOtD,CAAC;AAuCF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,kBAAkB,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;IACvD,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,sBAAsB,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAC;IAC/D,cAAc,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC/C,kBAAkB,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACnD,wBAAwB,CAAC,EAAE,gCAAgC,GAAG,IAAI,CAAC;IACnE,iBAAiB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACtD,yBAAyB,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC7D,iBAAiB,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAAC;IACtE,uBAAuB,CAAC,EACtB,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7D,oBAAoB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnD,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CACxD,CAAC;AAYF,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAElD,eAAO,MAAM,wBAAwB,aAAa,CAAC;AAInD,eAAO,MAAM,wBAAwB,GACnC,cAAc,MAAM,EACpB,aAAa,MAAM,KAClB,MAAM,GAAG,IAWX,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,aAAa,MAAM,KAAG,OAEI,CAAC;AAEtE,eAAO,MAAM,yBAAyB,GACpC,eAAe,MAAM,EACrB,aAAa,MAAM,KAClB,MAAM,GAAG,IAoBX,CAAC;AA8bF,eAAO,MAAM,uBAAuB,GAClC,SAAS,gBAAgB,EACzB,aAAa,MAAM,KAClB,MAAM,GAAG,IAeX,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,SAAS,gBAAgB,EACzB,SAAS,IAAI,CAAC,eAAe,EAC7B,UAAU,IAAI,CAAC,cAAc,KAC5B,OAAO,CAAC,IAAI,CAuFd,CAAC;AAcF,eAAO,MAAM,eAAe,GAAI,SAAS,gBAAgB,KAAG,IAAI,CAAC,MAM7D,CAAC;AAEL,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG;IACrD,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,SAAS,qBAAqB,KAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,CAQlB,CAAC"}
|