Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: harden ac-login exit and usb device detection

+35 -12
+16 -2
fedac/native/ac-os
··· 674 674 if [ -e "/sys/block/${dev}/removable" ]; then 675 675 local rem=$(cat "/sys/block/${dev}/removable" 2>/dev/null) 676 676 if [ "${rem}" = "1" ] && [ -e "/sys/block/${dev}" ]; then 677 - echo "/dev/${dev}" 678 - return 0 677 + local dev_node="/dev/${dev}" 678 + if [ ! -b "${dev_node}" ]; then 679 + local majmin 680 + majmin=$(cat "/sys/block/${dev}/dev" 2>/dev/null || true) 681 + if [ -z "${majmin}" ]; then 682 + err "USB sysfs node exists but major:minor is missing for ${dev}" 683 + return 1 684 + fi 685 + log "Repairing ${dev_node} as block device ${majmin}" 686 + sudo rm -f "${dev_node}" 687 + sudo mknod "${dev_node}" b "${majmin%%:*}" "${majmin##*:}" 688 + fi 689 + if [ -b "${dev_node}" ]; then 690 + echo "${dev_node}" 691 + return 0 692 + fi 679 693 fi 680 694 fi 681 695 done
+19 -10
tezos/ac-login.mjs
··· 131 131 // Start local callback server 132 132 async function startLocalCallbackServer(state, codeVerifier, codeChallenge, { forcePrompt = false } = {}) { 133 133 return new Promise((resolve, reject) => { 134 + let done = false; 135 + const finish = (fn, value) => { 136 + if (done) return; 137 + done = true; 138 + clearTimeout(timeout); 139 + server.close(() => fn(value)); 140 + }; 141 + 134 142 const server = http.createServer(async (req, res) => { 135 143 const url = new URL(req.url, `http://localhost:${CALLBACK_PORT}`); 136 144 ··· 183 191 </div> 184 192 </body> 185 193 </html>`); 186 - server.close(); 187 - reject(new Error(error)); 194 + finish(reject, new Error(error)); 188 195 return; 189 196 } 190 197 ··· 279 286 </body> 280 287 </html>`); 281 288 282 - server.close(); 283 - resolve({ tokens, user: { ...user, handle: acHandle } }); 289 + finish(resolve, { tokens, user: { ...user, handle: acHandle } }); 284 290 } catch (err) { 285 291 res.writeHead(500, { 'Content-Type': 'text/plain' }); 286 292 res.end(`Error: ${err.message}`); 287 - server.close(); 288 - reject(err); 293 + finish(reject, err); 289 294 } 290 295 }); 291 296 ··· 302 307 303 308 server.on('error', (err) => { 304 309 if (err.code === 'EADDRINUSE') { 305 - reject(new Error(`Port ${CALLBACK_PORT} is already in use.`)); 310 + finish(reject, new Error(`Port ${CALLBACK_PORT} is already in use.`)); 306 311 } else { 307 - reject(err); 312 + finish(reject, err); 308 313 } 309 314 }); 310 - 311 - setTimeout(() => { server.close(); reject(new Error('Login timeout')); }, 5 * 60 * 1000); 315 + 316 + const timeout = setTimeout( 317 + () => finish(reject, new Error('Login timeout')), 318 + 5 * 60 * 1000, 319 + ); 320 + timeout.unref?.(); 312 321 }); 313 322 } 314 323