mirror of
https://github.com/getgrav/grav-plugin-admin.git
synced 2025-10-26 00:36:31 +02:00
more fixes for installation process
This commit is contained in:
@@ -1025,11 +1025,11 @@ class SafeUpgradeManager
|
||||
$context = [];
|
||||
|
||||
if ($this->jobManifestPath) {
|
||||
$context['manifest'] = $this->jobManifestPath;
|
||||
$context['manifest'] = $this->convertPathForContext($this->jobManifestPath);
|
||||
}
|
||||
|
||||
if ($this->progressPath) {
|
||||
$context['progress'] = $this->progressPath;
|
||||
$context['progress'] = $this->convertPathForContext($this->progressPath);
|
||||
}
|
||||
|
||||
if (!$context) {
|
||||
@@ -1041,6 +1041,20 @@ class SafeUpgradeManager
|
||||
return $encoded === false ? null : base64_encode($encoded);
|
||||
}
|
||||
|
||||
private function convertPathForContext(string $path): string
|
||||
{
|
||||
$normalized = str_replace('\\', '/', $path);
|
||||
$root = str_replace('\\', '/', GRAV_ROOT);
|
||||
|
||||
if (strpos($normalized, $root) === 0) {
|
||||
$relative = substr($normalized, strlen($root));
|
||||
|
||||
return ltrim($relative, '/');
|
||||
}
|
||||
|
||||
return $normalized;
|
||||
}
|
||||
|
||||
protected function ensureExecutablePermissions(): void
|
||||
{
|
||||
$executables = [
|
||||
|
||||
@@ -2,10 +2,14 @@
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
$root = dirname(__DIR__, 3);
|
||||
$root = \defined('GRAV_ROOT') ? GRAV_ROOT : dirname(__DIR__, 3);
|
||||
$jobsDir = $root . '/user/data/upgrades/jobs';
|
||||
$fallbackProgress = $root . '/user/data/upgrades/safe-upgrade-progress.json';
|
||||
|
||||
if (!\defined('GRAV_ROOT')) {
|
||||
\define('GRAV_ROOT', $root);
|
||||
}
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
|
||||
header('Pragma: no-cache');
|
||||
@@ -44,6 +48,18 @@ $normalizeDir = static function (string $path): string {
|
||||
|
||||
$jobsDirNormalized = $normalizeDir($jobsDir);
|
||||
$userDataDirNormalized = $normalizeDir(dirname($jobsDir));
|
||||
$toRelative = static function (string $path): string {
|
||||
$normalized = str_replace('\\', '/', $path);
|
||||
$root = str_replace('\\', '/', GRAV_ROOT);
|
||||
|
||||
if (strpos($normalized, $root) === 0) {
|
||||
$relative = substr($normalized, strlen($root));
|
||||
|
||||
return ltrim($relative, '/');
|
||||
}
|
||||
|
||||
return $normalized;
|
||||
};
|
||||
|
||||
$contextParam = $_GET['context'] ?? '';
|
||||
if ($contextParam !== '') {
|
||||
@@ -52,7 +68,17 @@ if ($contextParam !== '') {
|
||||
$decoded = json_decode($decodedRaw, true);
|
||||
if (is_array($decoded)) {
|
||||
$validatePath = static function (string $candidate) use ($normalizeDir, $jobsDirNormalized, $userDataDirNormalized) {
|
||||
if ($candidate === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$candidate = str_replace('\\', '/', $candidate);
|
||||
|
||||
if ($candidate[0] !== '/' && !preg_match('/^[A-Za-z]:[\\\\\/]/', $candidate)) {
|
||||
$candidate = GRAV_ROOT . '/' . ltrim($candidate, '/');
|
||||
$candidate = str_replace('\\', '/', $candidate);
|
||||
}
|
||||
|
||||
$directory = dirname($candidate);
|
||||
$real = realpath($directory);
|
||||
if ($real === false) {
|
||||
@@ -133,10 +159,10 @@ if ($jobId !== '' && is_array($progress) && !isset($progress['job_id'])) {
|
||||
|
||||
$contextPayload = [];
|
||||
if ($manifestPath) {
|
||||
$contextPayload['manifest'] = $manifestPath;
|
||||
$contextPayload['manifest'] = $toRelative($manifestPath);
|
||||
}
|
||||
if ($progressPath) {
|
||||
$contextPayload['progress'] = $progressPath;
|
||||
$contextPayload['progress'] = $toRelative($progressPath);
|
||||
}
|
||||
|
||||
$contextToken = $contextPayload ? base64_encode(json_encode($contextPayload)) : null;
|
||||
|
||||
@@ -55,6 +55,7 @@ export default class SafeUpgrade {
|
||||
this.jobId = null;
|
||||
this.statusFailures = 0;
|
||||
this.statusContext = null;
|
||||
this.statusIdleCount = 0;
|
||||
this.directStatusUrl = this.resolveDirectStatusUrl();
|
||||
this.preferDirectStatus = !!this.directStatusUrl;
|
||||
|
||||
@@ -122,6 +123,7 @@ export default class SafeUpgrade {
|
||||
this.statusFailures = 0;
|
||||
this.preferDirectStatus = !!this.directStatusUrl;
|
||||
this.statusContext = null;
|
||||
this.statusIdleCount = 0;
|
||||
this.renderLoading();
|
||||
this.modal.open();
|
||||
this.fetchPreflight();
|
||||
@@ -512,6 +514,7 @@ export default class SafeUpgrade {
|
||||
let jobFailed = false;
|
||||
let shouldReload = false;
|
||||
let handled = false;
|
||||
let lastPayload = null;
|
||||
|
||||
console.debug('[SafeUpgrade] poll status');
|
||||
|
||||
@@ -545,6 +548,7 @@ export default class SafeUpgrade {
|
||||
}
|
||||
|
||||
const payload = response.data || {};
|
||||
lastPayload = payload;
|
||||
if (Object.prototype.hasOwnProperty.call(payload, 'context')) {
|
||||
this.statusContext = payload.context || null;
|
||||
}
|
||||
@@ -552,6 +556,12 @@ export default class SafeUpgrade {
|
||||
const data = payload.progress || payload;
|
||||
nextStage = data.stage || null;
|
||||
|
||||
if (!job || !Object.keys(job).length) {
|
||||
this.statusIdleCount += 1;
|
||||
} else {
|
||||
this.statusIdleCount = 0;
|
||||
}
|
||||
|
||||
this.renderProgress(data, job);
|
||||
|
||||
if (job.status === 'error') {
|
||||
@@ -600,6 +610,10 @@ export default class SafeUpgrade {
|
||||
const delay = Math.min(5000, 1200 * Math.max(1, this.statusFailures));
|
||||
this.schedulePoll(delay);
|
||||
}
|
||||
} else if ((!lastPayload || !lastPayload.job || !Object.keys(lastPayload.job).length) && usingDirect && this.statusIdleCount >= 5) {
|
||||
this.preferDirectStatus = false;
|
||||
this.statusFailures = 0;
|
||||
this.schedulePoll();
|
||||
} else if (jobFailed) {
|
||||
this.stopPolling();
|
||||
this.jobId = null;
|
||||
|
||||
13
themes/grav/js/admin.min.js
vendored
13
themes/grav/js/admin.min.js
vendored
@@ -4611,6 +4611,7 @@ var SafeUpgrade = /*#__PURE__*/function () {
|
||||
this.jobId = null;
|
||||
this.statusFailures = 0;
|
||||
this.statusContext = null;
|
||||
this.statusIdleCount = 0;
|
||||
this.directStatusUrl = this.resolveDirectStatusUrl();
|
||||
this.preferDirectStatus = !!this.directStatusUrl;
|
||||
this.registerEvents();
|
||||
@@ -4678,6 +4679,7 @@ var SafeUpgrade = /*#__PURE__*/function () {
|
||||
this.statusFailures = 0;
|
||||
this.preferDirectStatus = !!this.directStatusUrl;
|
||||
this.statusContext = null;
|
||||
this.statusIdleCount = 0;
|
||||
this.renderLoading();
|
||||
this.modal.open();
|
||||
this.fetchPreflight();
|
||||
@@ -4984,6 +4986,7 @@ var SafeUpgrade = /*#__PURE__*/function () {
|
||||
var jobFailed = false;
|
||||
var shouldReload = false;
|
||||
var handled = false;
|
||||
var lastPayload = null;
|
||||
console.debug('[SafeUpgrade] poll status');
|
||||
var endpoint = this.resolveStatusEndpoint();
|
||||
var statusUrl = endpoint.url;
|
||||
@@ -5016,8 +5019,14 @@ var SafeUpgrade = /*#__PURE__*/function () {
|
||||
_this6.statusContext = payload.context || null;
|
||||
}
|
||||
var job = payload.job || {};
|
||||
lastPayload = payload;
|
||||
var data = payload.progress || payload;
|
||||
nextStage = data.stage || null;
|
||||
if (!job || !Object.keys(job).length) {
|
||||
_this6.statusIdleCount += 1;
|
||||
} else {
|
||||
_this6.statusIdleCount = 0;
|
||||
}
|
||||
_this6.renderProgress(data, job);
|
||||
if (job.status === 'error') {
|
||||
nextStage = 'error';
|
||||
@@ -5061,6 +5070,10 @@ var SafeUpgrade = /*#__PURE__*/function () {
|
||||
var delay = Math.min(5000, 1200 * Math.max(1, _this6.statusFailures));
|
||||
_this6.schedulePoll(delay);
|
||||
}
|
||||
} else if ((!lastPayload || !lastPayload.job || !Object.keys(lastPayload.job).length) && usingDirect && _this6.statusIdleCount >= 5) {
|
||||
_this6.preferDirectStatus = false;
|
||||
_this6.statusFailures = 0;
|
||||
_this6.schedulePoll();
|
||||
} else if (jobFailed) {
|
||||
_this6.stopPolling();
|
||||
_this6.jobId = null;
|
||||
|
||||
Reference in New Issue
Block a user