pinokiod 7.2.11 → 7.2.12

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.
@@ -72,7 +72,7 @@ const managedCacheEnvDefaults = () => {
72
72
  return defaults
73
73
  }
74
74
 
75
- const ensureCachePreflightDir = async (key, targetPath) => {
75
+ const ensureCachePreflightDir = async (key, targetPath, options = {}) => {
76
76
  logCachePreflight(`${key}: target=${targetPath}`)
77
77
  try {
78
78
  await fs.promises.mkdir(targetPath, { recursive: true })
@@ -95,7 +95,26 @@ const ensureCachePreflightDir = async (key, targetPath) => {
95
95
  logCachePreflight(`${key}: repair delete ok`)
96
96
  } catch (error) {
97
97
  logCachePreflight(`${key}: repair delete failed ${formatCachePreflightError(error)}`)
98
- return { key, path: targetPath, repaired: false, ok: false, step: "repair delete", error }
98
+ if (typeof options.elevatedRepair !== "function") {
99
+ return { key, path: targetPath, repaired: false, ok: false, step: "repair delete", error }
100
+ }
101
+ logCachePreflight(`${key}: elevated repair start path=${targetPath}`)
102
+ let elevatedRepair
103
+ try {
104
+ elevatedRepair = await options.elevatedRepair(targetPath, logCachePreflight)
105
+ } catch (repairError) {
106
+ elevatedRepair = { ok: false, error: repairError }
107
+ }
108
+ if (!elevatedRepair || !elevatedRepair.ok) {
109
+ return { key, path: targetPath, repaired: false, elevated: true, ok: false, step: "elevated repair", error: elevatedRepair && elevatedRepair.error ? elevatedRepair.error : error }
110
+ }
111
+ const elevatedProbe = await probeCacheDir(targetPath)
112
+ if (elevatedProbe.ok) {
113
+ logCachePreflight(`${key}: elevated repair probe ok`)
114
+ return { key, path: targetPath, repaired: true, elevated: true, ok: true }
115
+ }
116
+ logCachePreflight(`${key}: elevated repair probe failed step="${elevatedProbe.step}" ${formatCachePreflightError(elevatedProbe.error)}`)
117
+ return { key, path: targetPath, repaired: true, elevated: true, ok: false, step: elevatedProbe.step, error: elevatedProbe.error }
99
118
  }
100
119
 
101
120
  try {
@@ -140,7 +159,7 @@ const ensurePinokioCacheDirs = async (kernel, options = {}) => {
140
159
 
141
160
  for (const key of CACHE_PREFLIGHT_KEYS) {
142
161
  const targetPath = path.resolve(cacheRoot, key)
143
- const result = await ensureCachePreflightDir(key, targetPath)
162
+ const result = await ensureCachePreflightDir(key, targetPath, options)
144
163
  results.push(result)
145
164
  if (!result.ok) {
146
165
  errors.push(result)
package/kernel/index.js CHANGED
@@ -44,6 +44,7 @@ const WatchManager = require('./watch')
44
44
  const { DownloaderHelper } = require('node-downloader-helper');
45
45
  const { ProxyAgent } = require('proxy-agent');
46
46
  const fakeUa = require('fake-useragent');
47
+ const sudo = process.platform === "win32" ? require("sudo-prompt-programfiles-x86") : null
47
48
  //const kill = require('./tree-kill');
48
49
  const kill = require('kill-sync')
49
50
  const ejs = require('ejs');
@@ -55,6 +56,34 @@ const VARS = {
55
56
  }
56
57
  }
57
58
 
59
+ const powershellSingleQuote = (value) => {
60
+ return `'${String(value).replace(/'/g, "''")}'`
61
+ }
62
+
63
+ const windowsCacheRepairCommand = (targetPath) => {
64
+ const psPath = powershellSingleQuote(targetPath)
65
+ return [
66
+ "powershell.exe",
67
+ "-NoProfile",
68
+ "-ExecutionPolicy Bypass",
69
+ "-Command",
70
+ `"`,
71
+ "$ErrorActionPreference = 'Stop';",
72
+ `$p = ${psPath};`,
73
+ "$account = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name;",
74
+ "$grant = $account + ':(OI)(CI)F';",
75
+ "if (Test-Path -LiteralPath $p) {",
76
+ " & takeown.exe /F $p /R /D Y;",
77
+ " & icacls.exe $p /reset /T /C;",
78
+ " & icacls.exe $p /grant $grant /T /C;",
79
+ " Remove-Item -LiteralPath $p -Recurse -Force;",
80
+ "}",
81
+ "New-Item -ItemType Directory -Force -Path $p | Out-Null;",
82
+ "& icacls.exe $p /grant $grant /T /C;",
83
+ `"`
84
+ ].join(" ")
85
+ }
86
+
58
87
  //const memwatch = require('@airbnb/node-memwatch');
59
88
  class Kernel {
60
89
  schema = "<=7.0.0"
@@ -465,6 +494,30 @@ class Kernel {
465
494
  return ''
466
495
  }
467
496
  }
497
+ async elevatedCacheRepair(targetPath, log = console.log) {
498
+ if (this.platform !== "win32" || !sudo) {
499
+ return { ok: false, error: new Error("Elevated cache repair is only available on Windows") }
500
+ }
501
+ const command = windowsCacheRepairCommand(targetPath)
502
+ log(`elevated repair command=${command}`)
503
+ return new Promise((resolve) => {
504
+ sudo.exec(command, { name: "Pinokio" }, (error, stdout, stderr) => {
505
+ if (stdout && stdout.trim()) {
506
+ log(`elevated repair stdout ${stdout.trim()}`)
507
+ }
508
+ if (stderr && stderr.trim()) {
509
+ log(`elevated repair stderr ${stderr.trim()}`)
510
+ }
511
+ if (error) {
512
+ log(`elevated repair failed ${error.message || error}`)
513
+ resolve({ ok: false, error, stdout, stderr })
514
+ } else {
515
+ log(`elevated repair ok path=${targetPath}`)
516
+ resolve({ ok: true, stdout, stderr })
517
+ }
518
+ })
519
+ })
520
+ }
468
521
  async ensureRouterMode() {
469
522
  const domain = await this.resolvePinokioDomain()
470
523
  const shouldUseCustom = domain.length > 0
@@ -1053,7 +1106,10 @@ class Kernel {
1053
1106
 
1054
1107
  // 2. mkdir all the folders if not already created
1055
1108
  await Environment.init_folders(this.homedir, this)
1056
- await Environment.ensurePinokioCacheDirs(this)
1109
+ await Environment.ensurePinokioCacheDirs(this, {
1110
+ throwOnFailure: true,
1111
+ elevatedRepair: this.elevatedCacheRepair.bind(this)
1112
+ })
1057
1113
 
1058
1114
  // if key.json doesn't exist, create an empty json file
1059
1115
  let ee = await this.exists(this.homedir, "key.json")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pinokiod",
3
- "version": "7.2.11",
3
+ "version": "7.2.12",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/server/index.js CHANGED
@@ -5707,6 +5707,16 @@ class Server {
5707
5707
 
5708
5708
  needsManagedRefresh = true
5709
5709
  console.log("[TRY] Updating to the new version")
5710
+ let envPath = path.resolve(home, "ENVIRONMENT")
5711
+ let envExists = await this.kernel.exists(envPath)
5712
+ if (!envExists) {
5713
+ let str = await Environment.ENV("system", home, this.kernel)
5714
+ await fs.promises.writeFile(envPath, str)
5715
+ }
5716
+ await Environment.ensurePinokioCacheDirs(this.kernel, {
5717
+ throwOnFailure: true,
5718
+ elevatedRepair: this.kernel.elevatedCacheRepair.bind(this.kernel)
5719
+ })
5710
5720
  this.kernel.store.set("version", this.version.pinokiod)
5711
5721
  console.log("[DONE] Updating to the new version")
5712
5722
  console.log("not up to date. update py.")