]> zoso.dev Git - nano-pow.git/commitdiff
Reimplement CSP and generate script hash to use for puppeteer page content. Get GPU...
authorChris Duncan <chris@zoso.dev>
Fri, 21 Mar 2025 14:15:50 +0000 (07:15 -0700)
committerChris Duncan <chris@zoso.dev>
Fri, 21 Mar 2025 14:15:50 +0000 (07:15 -0700)
src/bin/cli.ts

index 7c314414bd17afad52fbab7bc7067cbae63bc337..138c7425fce8c6fdf2714349794a0072a9fa7222 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/env node
 //! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
 //! SPDX-License-Identifier: GPL-3.0-or-later
+/// <reference types="@webgpu/types" />
 
 import * as fs from 'node:fs/promises'
 import * as readline from 'node:readline/promises'
@@ -123,8 +124,30 @@ if (hashes.length === 0) {
                ]
        })
        const page = await browser.newPage()
-       await page.setBypassCSP(true)
-       await page.goto('chrome://terms')
+       const cliPage = `${import.meta.dirname}/cli.html`
+       await fs.writeFile(cliPage, '')
+       await page.goto(import.meta.resolve('./cli.html'))
+       await page.waitForFunction(async () => {
+               return await navigator.gpu.requestAdapter()
+       })
+
+       const inject = `
+               ${NanoPow}
+               window.results = []
+               const hashes = ["${hashes.join('","')}"]
+               for (const hash of hashes) {
+                       try {
+                               const work = await NanoPow.${fn}(${work}hash, ${JSON.stringify(options)})
+                               window.results.push(work)
+                               console.log(\`cli \${work}\`)
+                       } catch (err) {
+                               console.error(\`cli \${err}\`)
+                       }
+               }
+               console.log('cli exit')
+       `
+       const hash = await crypto.subtle.digest('SHA-256', Buffer.from(inject, 'utf-8'))
+       const src = `sha256-${Buffer.from(hash).toString('base64')}`
 
        let start = performance.now()
        page.on('console', async (msg) => {
@@ -153,31 +176,15 @@ if (hashes.length === 0) {
                        console.log(msg.text())
                }
        })
-       await page.waitForFunction(async () => {
-               return await navigator.gpu.requestAdapter()
-       })
        start = performance.now()
-       await page.addScriptTag({
-               type: 'module',
-               content: `
-                       window.trustedTypes?.createPolicy?.('default', {
-                               createHTML: string => string,
-                               createScriptURL: string => string,
-                               createScript: string => string,
-                       })
-                       ${NanoPow}
-                       window.results = []
-                       const hashes = ["${hashes.join('","')}"]
-                       for (const hash of hashes) {
-                               try {
-                                       const work = await NanoPow.${fn}(${work}hash, ${JSON.stringify(options)})
-                                       window.results.push(work)
-                                       console.log(\`cli \${work}\`)
-                               } catch (err) {
-                                       console.error(\`cli \${err}\`)
-                               }
-                       }
-                       console.log('cli exit')
-               `
-       })
+       await page.setContent(`
+               <!DOCTYPE html>
+                       <head>
+                               <meta http-equiv="Content-Security-Policy" content="default-src 'none'; base-uri 'none'; form-action 'none'; script-src '${src}';">
+                               <script type="module">${inject}</script>
+                       </head>
+               </html>
+       `)
+       await fs.unlink(cliPage)
+       if (options['debug']) console.log('Puppeteer initialized')
 })()