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.
@@ -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-CYwLv9pf.js"></script>
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 with the done exclusion through the token gate', async () => {
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: [{ projectItemId: 'PVTI_keep' }, { projectItemId: 'PVTI_drop' }],
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: ['PVTI_drop'] }),
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: [{ projectItemId: 'PVTI_keep' }],
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, '/tdpm.txt');
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, '/tdpm.txt');
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, '/tdpm.txt');
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, '/tdpm.txt');
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, '/tdpm.txt');
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, '/tdpm.txt');
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('re-hides an item recorded as done until the next regeneration bounds it to one cycle', () => {
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(0);
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":"AAGA,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;AA0CF,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,mBA6CF,CAAC"}
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":"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"}