admin: Handle latest version unknown in admin dashboard (#8858)
* Handle latest version unknown in admin dashboard * fix tests Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix tsc Signed-off-by: Jens Langhammer <jens@goauthentik.io> --------- Signed-off-by: Jens Langhammer <jens@goauthentik.io> Co-authored-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
@ -10,7 +10,7 @@ from rest_framework.response import Response
|
|||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
|
|
||||||
from authentik import __version__, get_build_hash
|
from authentik import __version__, get_build_hash
|
||||||
from authentik.admin.tasks import VERSION_CACHE_KEY, update_latest_version
|
from authentik.admin.tasks import VERSION_CACHE_KEY, VERSION_NULL, update_latest_version
|
||||||
from authentik.core.api.utils import PassiveSerializer
|
from authentik.core.api.utils import PassiveSerializer
|
||||||
|
|
||||||
|
|
||||||
@ -19,6 +19,7 @@ class VersionSerializer(PassiveSerializer):
|
|||||||
|
|
||||||
version_current = SerializerMethodField()
|
version_current = SerializerMethodField()
|
||||||
version_latest = SerializerMethodField()
|
version_latest = SerializerMethodField()
|
||||||
|
version_latest_valid = SerializerMethodField()
|
||||||
build_hash = SerializerMethodField()
|
build_hash = SerializerMethodField()
|
||||||
outdated = SerializerMethodField()
|
outdated = SerializerMethodField()
|
||||||
|
|
||||||
@ -38,6 +39,10 @@ class VersionSerializer(PassiveSerializer):
|
|||||||
return __version__
|
return __version__
|
||||||
return version_in_cache
|
return version_in_cache
|
||||||
|
|
||||||
|
def get_version_latest_valid(self, _) -> str:
|
||||||
|
"""Check if latest version is valid"""
|
||||||
|
return cache.get(VERSION_CACHE_KEY) != VERSION_NULL
|
||||||
|
|
||||||
def get_outdated(self, instance) -> bool:
|
def get_outdated(self, instance) -> bool:
|
||||||
"""Check if we're running the latest version"""
|
"""Check if we're running the latest version"""
|
||||||
return parse(self.get_version_current(instance)) < parse(self.get_version_latest(instance))
|
return parse(self.get_version_current(instance)) < parse(self.get_version_latest(instance))
|
||||||
|
@ -18,6 +18,7 @@ from authentik.lib.utils.http import get_http_session
|
|||||||
from authentik.root.celery import CELERY_APP
|
from authentik.root.celery import CELERY_APP
|
||||||
|
|
||||||
LOGGER = get_logger()
|
LOGGER = get_logger()
|
||||||
|
VERSION_NULL = "0.0.0"
|
||||||
VERSION_CACHE_KEY = "authentik_latest_version"
|
VERSION_CACHE_KEY = "authentik_latest_version"
|
||||||
VERSION_CACHE_TIMEOUT = 8 * 60 * 60 # 8 hours
|
VERSION_CACHE_TIMEOUT = 8 * 60 * 60 # 8 hours
|
||||||
# Chop of the first ^ because we want to search the entire string
|
# Chop of the first ^ because we want to search the entire string
|
||||||
@ -55,7 +56,7 @@ def clear_update_notifications():
|
|||||||
def update_latest_version(self: SystemTask):
|
def update_latest_version(self: SystemTask):
|
||||||
"""Update latest version info"""
|
"""Update latest version info"""
|
||||||
if CONFIG.get_bool("disable_update_check"):
|
if CONFIG.get_bool("disable_update_check"):
|
||||||
cache.set(VERSION_CACHE_KEY, "0.0.0", VERSION_CACHE_TIMEOUT)
|
cache.set(VERSION_CACHE_KEY, VERSION_NULL, VERSION_CACHE_TIMEOUT)
|
||||||
self.set_status(TaskStatus.WARNING, "Version check disabled.")
|
self.set_status(TaskStatus.WARNING, "Version check disabled.")
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
@ -82,7 +83,7 @@ def update_latest_version(self: SystemTask):
|
|||||||
event_dict["message"] = f"Changelog: {match.group()}"
|
event_dict["message"] = f"Changelog: {match.group()}"
|
||||||
Event.new(EventAction.UPDATE_AVAILABLE, **event_dict).save()
|
Event.new(EventAction.UPDATE_AVAILABLE, **event_dict).save()
|
||||||
except (RequestException, IndexError) as exc:
|
except (RequestException, IndexError) as exc:
|
||||||
cache.set(VERSION_CACHE_KEY, "0.0.0", VERSION_CACHE_TIMEOUT)
|
cache.set(VERSION_CACHE_KEY, VERSION_NULL, VERSION_CACHE_TIMEOUT)
|
||||||
self.set_error(exc)
|
self.set_error(exc)
|
||||||
|
|
||||||
|
|
||||||
|
@ -45583,6 +45583,10 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: Get latest version from cache
|
description: Get latest version from cache
|
||||||
readOnly: true
|
readOnly: true
|
||||||
|
version_latest_valid:
|
||||||
|
type: boolean
|
||||||
|
description: Latest version query is a valid non-default value
|
||||||
|
readOnly: true
|
||||||
build_hash:
|
build_hash:
|
||||||
type: string
|
type: string
|
||||||
description: Get build hash, if version is not latest or released
|
description: Get build hash, if version is not latest or released
|
||||||
@ -45596,6 +45600,7 @@ components:
|
|||||||
- outdated
|
- outdated
|
||||||
- version_current
|
- version_current
|
||||||
- version_latest
|
- version_latest
|
||||||
|
- version_latest_valid
|
||||||
WebAuthnDevice:
|
WebAuthnDevice:
|
||||||
type: object
|
type: object
|
||||||
description: Serializer for WebAuthn authenticator devices
|
description: Serializer for WebAuthn authenticator devices
|
||||||
|
@ -31,9 +31,15 @@ export class VersionStatusCard extends AdminStatusCard<Version> {
|
|||||||
message: html`${msg(str`${value.versionLatest} is available!`)}`,
|
message: html`${msg(str`${value.versionLatest} is available!`)}`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (value.versionLatestValid) {
|
||||||
|
return Promise.resolve<AdminStatus>({
|
||||||
|
icon: "fa fa-check-circle pf-m-success",
|
||||||
|
message: html`${msg("Up-to-date!")}`,
|
||||||
|
});
|
||||||
|
}
|
||||||
return Promise.resolve<AdminStatus>({
|
return Promise.resolve<AdminStatus>({
|
||||||
icon: "fa fa-check-circle pf-m-success",
|
icon: "fa fa-question-circle",
|
||||||
message: html`${msg("Up-to-date!")}`,
|
message: html`${msg("Latest version unknown")}`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user