From d37c33d941a162e7ac2e6a87ac07b3e5388869cd Mon Sep 17 00:00:00 2001 From: Jens Langhammer Date: Thu, 8 Apr 2021 23:20:48 +0200 Subject: [PATCH] sources/ldap: only save sync state in TaskInfo, return TaskInfo in API Signed-off-by: Jens Langhammer --- authentik/admin/api/tasks.py | 4 +- authentik/sources/ldap/api.py | 30 +++----- authentik/sources/ldap/models.py | 4 -- authentik/sources/ldap/tasks.py | 6 +- swagger.yaml | 26 +++---- web/src/locales/en.po | 68 +++++++++++++------ web/src/locales/pseudo-LOCALE.po | 66 ++++++++++++------ .../cards/LDAPSyncStatusCard.ts | 22 ++++-- .../pages/sources/ldap/LDAPSourceViewPage.ts | 24 +++++-- 9 files changed, 148 insertions(+), 102 deletions(-) diff --git a/authentik/admin/api/tasks.py b/authentik/admin/api/tasks.py index 68f5e1b4d..2903121e5 100644 --- a/authentik/admin/api/tasks.py +++ b/authentik/admin/api/tasks.py @@ -35,7 +35,9 @@ class TaskViewSet(ViewSet): permission_classes = [IsAdminUser] - @swagger_auto_schema(responses={200: TaskSerializer(many=False)}) + @swagger_auto_schema( + responses={200: TaskSerializer(many=False), 404: "Task not found"} + ) # pylint: disable=invalid-name def retrieve(self, request: Request, pk=None) -> Response: """Get a single system task""" diff --git a/authentik/sources/ldap/api.py b/authentik/sources/ldap/api.py index cb89f0e44..c74be3a9d 100644 --- a/authentik/sources/ldap/api.py +++ b/authentik/sources/ldap/api.py @@ -1,18 +1,16 @@ """Source API Views""" -from datetime import datetime -from time import time - -from django.core.cache import cache +from django.http.response import Http404 +from django.utils.text import slugify from drf_yasg.utils import swagger_auto_schema from rest_framework.decorators import action -from rest_framework.fields import DateTimeField from rest_framework.request import Request from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet +from authentik.admin.api.tasks import TaskSerializer from authentik.core.api.propertymappings import PropertyMappingSerializer from authentik.core.api.sources import SourceSerializer -from authentik.core.api.utils import PassiveSerializer +from authentik.events.monitored_tasks import TaskInfo from authentik.sources.ldap.models import LDAPPropertyMapping, LDAPSource @@ -43,12 +41,6 @@ class LDAPSourceSerializer(SourceSerializer): extra_kwargs = {"bind_password": {"write_only": True}} -class LDAPSourceSyncStatusSerializer(PassiveSerializer): - """LDAP Sync status""" - - last_sync = DateTimeField(read_only=True) - - class LDAPSourceViewSet(ModelViewSet): """LDAP Source Viewset""" @@ -56,18 +48,18 @@ class LDAPSourceViewSet(ModelViewSet): serializer_class = LDAPSourceSerializer lookup_field = "slug" - @swagger_auto_schema(responses={200: LDAPSourceSyncStatusSerializer(many=False)}) + @swagger_auto_schema( + responses={200: TaskSerializer(many=False), 404: "Task not found"} + ) @action(methods=["GET"], detail=True) # pylint: disable=unused-argument def sync_status(self, request: Request, slug: str) -> Response: """Get source's sync status""" source = self.get_object() - last_sync = cache.get(source.state_cache_prefix("last_sync"), time()) - return Response( - LDAPSourceSyncStatusSerializer( - {"last_sync": datetime.fromtimestamp(last_sync)} - ).data - ) + task = TaskInfo.by_name(f"ldap_sync_{slugify(source.name)}") + if not task: + raise Http404 + return Response(TaskSerializer(task, many=False).data) class LDAPPropertyMappingSerializer(PropertyMappingSerializer): diff --git a/authentik/sources/ldap/models.py b/authentik/sources/ldap/models.py index bdea6abf0..d9e0d60f9 100644 --- a/authentik/sources/ldap/models.py +++ b/authentik/sources/ldap/models.py @@ -81,10 +81,6 @@ class LDAPSource(Source): return LDAPSourceSerializer - def state_cache_prefix(self, suffix: str) -> str: - """Key by which the ldap source status is saved""" - return f"source_ldap_{self.pk}_state_{suffix}" - _connection: Optional[Connection] = None @property diff --git a/authentik/sources/ldap/tasks.py b/authentik/sources/ldap/tasks.py index 32a4e88b6..aaf28c132 100644 --- a/authentik/sources/ldap/tasks.py +++ b/authentik/sources/ldap/tasks.py @@ -1,7 +1,4 @@ """LDAP Sync tasks""" -from time import time - -from django.core.cache import cache from django.utils.text import slugify from ldap3.core.exceptions import LDAPException from structlog.stdlib import get_logger @@ -26,6 +23,7 @@ def ldap_sync_all(): @CELERY_APP.task(bind=True, base=MonitoredTask) def ldap_sync(self: MonitoredTask, source_pk: str): """Synchronization of an LDAP Source""" + self.result_timeout_hours = 2 try: source: LDAPSource = LDAPSource.objects.get(pk=source_pk) except LDAPSource.DoesNotExist: @@ -43,8 +41,6 @@ def ldap_sync(self: MonitoredTask, source_pk: str): sync_inst = sync_class(source) count = sync_inst.sync() messages.append(f"Synced {count} objects from {sync_class.__name__}") - cache_key = source.state_cache_prefix("last_sync") - cache.set(cache_key, time(), timeout=60 * 60) self.set_status( TaskResult( TaskResultStatus.SUCCESSFUL, diff --git a/swagger.yaml b/swagger.yaml index 7bee8f57b..4cfef041f 100755 --- a/swagger.yaml +++ b/swagger.yaml @@ -85,15 +85,15 @@ paths: description: '' schema: $ref: '#/definitions/Task' - '403': - description: Authentication credentials were invalid, absent or insufficient. - schema: - $ref: '#/definitions/GenericError' '404': description: Object does not exist or caller has insufficient permissions to access it. schema: $ref: '#/definitions/APIException' + '403': + description: Authentication credentials were invalid, absent or insufficient. + schema: + $ref: '#/definitions/GenericError' tags: - admin parameters: @@ -9602,16 +9602,16 @@ paths: '200': description: '' schema: - $ref: '#/definitions/LDAPSourceSyncStatus' - '403': - description: Authentication credentials were invalid, absent or insufficient. - schema: - $ref: '#/definitions/GenericError' + $ref: '#/definitions/Task' '404': description: Object does not exist or caller has insufficient permissions to access it. schema: $ref: '#/definitions/APIException' + '403': + description: Authentication credentials were invalid, absent or insufficient. + schema: + $ref: '#/definitions/GenericError' tags: - sources parameters: @@ -17021,14 +17021,6 @@ definitions: type: string format: uuid uniqueItems: true - LDAPSourceSyncStatus: - type: object - properties: - last_sync: - title: Last sync - type: string - format: date-time - readOnly: true SourceType: description: Get source's type configuration required: diff --git a/web/src/locales/en.po b/web/src/locales/en.po index 3567f100a..03eefd3fb 100644 --- a/web/src/locales/en.po +++ b/web/src/locales/en.po @@ -150,7 +150,7 @@ msgstr "App" #: src/elements/user/UserConsentList.ts:29 #: src/pages/admin-overview/TopApplicationsTable.ts:42 -#: src/pages/applications/ApplicationListPage.ts:95 +#: src/pages/applications/ApplicationListPage.ts:100 #: src/pages/providers/ProviderListPage.ts:53 msgid "Application" msgstr "Application" @@ -370,6 +370,10 @@ msgstr "Binding Type" msgid "Build hash: {0}" msgstr "Build hash: {0}" +#: src/pages/sources/SourcesListPage.ts:62 +msgid "Built-in" +msgstr "Built-in" + #: src/pages/outposts/ServiceConnectionDockerForm.ts:89 msgid "CA which the endpoint's Certificate is verified against. Can be left empty for no validation." msgstr "CA which the endpoint's Certificate is verified against. Can be left empty for no validation." @@ -654,8 +658,8 @@ msgid "Copy Key" msgstr "Copy Key" #: src/pages/applications/ApplicationForm.ts:120 -#: src/pages/applications/ApplicationListPage.ts:111 -#: src/pages/applications/ApplicationListPage.ts:119 +#: src/pages/applications/ApplicationListPage.ts:116 +#: src/pages/applications/ApplicationListPage.ts:124 #: src/pages/crypto/CertificateKeyPairListPage.ts:122 #: src/pages/crypto/CertificateKeyPairListPage.ts:130 #: src/pages/events/RuleListPage.ts:91 @@ -684,8 +688,8 @@ msgstr "Copy Key" #: src/pages/providers/ProviderListPage.ts:116 #: src/pages/providers/RelatedApplicationButton.ts:27 #: src/pages/providers/RelatedApplicationButton.ts:35 -#: src/pages/sources/SourcesListPage.ts:100 -#: src/pages/sources/SourcesListPage.ts:109 +#: src/pages/sources/SourcesListPage.ts:115 +#: src/pages/sources/SourcesListPage.ts:124 #: src/pages/stages/StageListPage.ts:119 #: src/pages/stages/StageListPage.ts:128 #: src/pages/stages/invitation/InvitationListPage.ts:77 @@ -701,7 +705,7 @@ msgstr "Copy Key" msgid "Create" msgstr "Create" -#: src/pages/applications/ApplicationListPage.ts:114 +#: src/pages/applications/ApplicationListPage.ts:119 #: src/pages/providers/RelatedApplicationButton.ts:30 msgid "Create Application" msgstr "Create Application" @@ -782,7 +786,7 @@ msgstr "Create provider" #: src/pages/policies/PolicyListPage.ts:136 #: src/pages/property-mappings/PropertyMappingListPage.ts:125 #: src/pages/providers/ProviderListPage.ts:119 -#: src/pages/sources/SourcesListPage.ts:112 +#: src/pages/sources/SourcesListPage.ts:127 #: src/pages/stages/StageListPage.ts:131 msgid "Create {0}" msgstr "Create {0}" @@ -826,7 +830,7 @@ msgid "Define how notifications are sent to users, like Email or Webhook." msgstr "Define how notifications are sent to users, like Email or Webhook." #: src/elements/forms/DeleteForm.ts:79 -#: src/pages/applications/ApplicationListPage.ts:102 +#: src/pages/applications/ApplicationListPage.ts:107 #: src/pages/crypto/CertificateKeyPairListPage.ts:86 #: src/pages/events/RuleListPage.ts:82 #: src/pages/events/TransportListPage.ts:86 @@ -837,7 +841,7 @@ msgstr "Define how notifications are sent to users, like Email or Webhook." #: src/pages/policies/PolicyListPage.ts:115 #: src/pages/property-mappings/PropertyMappingListPage.ts:104 #: src/pages/providers/ProviderListPage.ts:98 -#: src/pages/sources/SourcesListPage.ts:91 +#: src/pages/sources/SourcesListPage.ts:106 #: src/pages/stages/StageListPage.ts:110 #: src/pages/stages/invitation/InvitationListPage.ts:68 #: src/pages/stages/prompt/PromptListPage.ts:87 @@ -939,7 +943,7 @@ msgstr "Disable Static Tokens" msgid "Disable Time-based OTP" msgstr "Disable Time-based OTP" -#: src/pages/sources/SourcesListPage.ts:60 +#: src/pages/sources/SourcesListPage.ts:75 msgid "Disabled" msgstr "Disabled" @@ -976,7 +980,7 @@ msgstr "Each provider has a different issuer, based on the application slug." #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:139 #: src/pages/providers/proxy/ProxyProviderViewPage.ts:138 #: src/pages/providers/saml/SAMLProviderViewPage.ts:132 -#: src/pages/sources/SourcesListPage.ts:79 +#: src/pages/sources/SourcesListPage.ts:94 #: src/pages/sources/ldap/LDAPSourceViewPage.ts:116 #: src/pages/sources/oauth/OAuthSourceViewPage.ts:135 #: src/pages/sources/saml/SAMLSourceViewPage.ts:122 @@ -1592,8 +1596,8 @@ msgstr "Last run" msgid "Last seen: {0}" msgstr "Last seen: {0}" -#: src/pages/admin-overview/cards/LDAPSyncStatusCard.ts:23 -#: src/pages/sources/ldap/LDAPSourceViewPage.ts:150 +#: src/pages/admin-overview/cards/LDAPSyncStatusCard.ts:25 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:154 msgid "Last sync: {0}" msgstr "Last sync: {0}" @@ -1950,11 +1954,11 @@ msgstr "Not connected." msgid "Not found" msgstr "Not found" -#: src/pages/sources/ldap/LDAPSourceViewPage.ts:148 -msgid "Not synced in the last hour, check System tasks." -msgstr "Not synced in the last hour, check System tasks." +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:165 +msgid "Not synced yet." +msgstr "Not synced yet." -#: src/pages/admin-overview/cards/LDAPSyncStatusCard.ts:32 +#: src/pages/admin-overview/cards/LDAPSyncStatusCard.ts:40 msgid "Not synced." msgstr "Not synced." @@ -2043,6 +2047,10 @@ msgstr "Only fail the policy, don't set user's password." msgid "Only send notification once, for example when sending a webhook into a chat channel." msgstr "Only send notification once, for example when sending a webhook into a chat channel." +#: src/pages/applications/ApplicationListPage.ts:95 +msgid "Open application" +msgstr "Open application" + #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:172 msgid "OpenID Configuration Issuer" msgstr "OpenID Configuration Issuer" @@ -2472,7 +2480,7 @@ msgstr "Resources" msgid "Result" msgstr "Result" -#: src/pages/sources/ldap/LDAPSourceViewPage.ts:163 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:177 #: src/pages/system-tasks/SystemTaskListPage.ts:107 msgid "Retry Task" msgstr "Retry Task" @@ -2589,7 +2597,7 @@ msgstr "See documentation for a list of all variables." msgid "Select a provider that this application should use. Alternatively, create a new provider." msgstr "Select a provider that this application should use. Alternatively, create a new provider." -#: src/elements/table/Table.ts:215 +#: src/elements/table/Table.ts:218 msgid "Select all rows" msgstr "Select all rows" @@ -2726,7 +2734,7 @@ msgid "Something went wrong! Please try again later." msgstr "Something went wrong! Please try again later." #: src/pages/providers/ProviderListPage.ts:91 -#: src/pages/sources/SourcesListPage.ts:84 +#: src/pages/sources/SourcesListPage.ts:99 msgid "Source" msgstr "Source" @@ -3101,6 +3109,10 @@ msgstr "Symbol charset" msgid "Sync" msgstr "Sync" +#: src/pages/admin-overview/cards/LDAPSyncStatusCard.ts:31 +msgid "Sync failed." +msgstr "Sync failed." + #: src/pages/sources/ldap/LDAPSourceForm.ts:93 msgid "Sync groups" msgstr "Sync groups" @@ -3142,6 +3154,14 @@ msgstr "TOTP Authenticators" msgid "Target" msgstr "Target" +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:151 +msgid "Task finished with errors" +msgstr "Task finished with errors" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:148 +msgid "Task finished with warnings" +msgstr "Task finished with warnings" + #: src/pages/stages/email/EmailStageForm.ts:157 msgid "Template" msgstr "Template" @@ -3351,7 +3371,7 @@ msgstr "Up-to-date!" #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:129 #: src/pages/providers/proxy/ProxyProviderViewPage.ts:128 #: src/pages/providers/saml/SAMLProviderViewPage.ts:122 -#: src/pages/sources/SourcesListPage.ts:66 +#: src/pages/sources/SourcesListPage.ts:81 #: src/pages/sources/ldap/LDAPSourceViewPage.ts:106 #: src/pages/sources/oauth/OAuthSourceViewPage.ts:125 #: src/pages/sources/saml/SAMLSourceViewPage.ts:112 @@ -3454,7 +3474,7 @@ msgstr "Update details" #: src/pages/policies/PolicyListPage.ts:80 #: src/pages/property-mappings/PropertyMappingListPage.ts:69 #: src/pages/providers/ProviderListPage.ts:76 -#: src/pages/sources/SourcesListPage.ts:69 +#: src/pages/sources/SourcesListPage.ts:84 #: src/pages/stages/StageListPage.ts:88 #: src/pages/users/UserActiveForm.ts:41 msgid "Update {0}" @@ -3714,6 +3734,10 @@ msgstr "Yes" msgid "You're currently impersonating {0}." msgstr "You're currently impersonating {0}." +#: src/pages/sources/SourcesListPage.ts:61 +msgid "authentik Built-in" +msgstr "authentik Built-in" + #: src/pages/stages/password/PasswordStageForm.ts:76 msgid "authentik Builtin Database" msgstr "authentik Builtin Database" diff --git a/web/src/locales/pseudo-LOCALE.po b/web/src/locales/pseudo-LOCALE.po index a95087e42..72ec35966 100644 --- a/web/src/locales/pseudo-LOCALE.po +++ b/web/src/locales/pseudo-LOCALE.po @@ -150,7 +150,7 @@ msgstr "" #: src/elements/user/UserConsentList.ts:29 #: src/pages/admin-overview/TopApplicationsTable.ts:42 -#: src/pages/applications/ApplicationListPage.ts:95 +#: src/pages/applications/ApplicationListPage.ts:100 #: src/pages/providers/ProviderListPage.ts:53 msgid "Application" msgstr "" @@ -366,6 +366,10 @@ msgstr "" msgid "Build hash: {0}" msgstr "" +#: src/pages/sources/SourcesListPage.ts:62 +msgid "Built-in" +msgstr "" + #: src/pages/outposts/ServiceConnectionDockerForm.ts:89 msgid "CA which the endpoint's Certificate is verified against. Can be left empty for no validation." msgstr "" @@ -650,8 +654,8 @@ msgid "Copy Key" msgstr "" #: src/pages/applications/ApplicationForm.ts:120 -#: src/pages/applications/ApplicationListPage.ts:111 -#: src/pages/applications/ApplicationListPage.ts:119 +#: src/pages/applications/ApplicationListPage.ts:116 +#: src/pages/applications/ApplicationListPage.ts:124 #: src/pages/crypto/CertificateKeyPairListPage.ts:122 #: src/pages/crypto/CertificateKeyPairListPage.ts:130 #: src/pages/events/RuleListPage.ts:91 @@ -680,8 +684,8 @@ msgstr "" #: src/pages/providers/ProviderListPage.ts:116 #: src/pages/providers/RelatedApplicationButton.ts:27 #: src/pages/providers/RelatedApplicationButton.ts:35 -#: src/pages/sources/SourcesListPage.ts:100 -#: src/pages/sources/SourcesListPage.ts:109 +#: src/pages/sources/SourcesListPage.ts:115 +#: src/pages/sources/SourcesListPage.ts:124 #: src/pages/stages/StageListPage.ts:119 #: src/pages/stages/StageListPage.ts:128 #: src/pages/stages/invitation/InvitationListPage.ts:77 @@ -697,7 +701,7 @@ msgstr "" msgid "Create" msgstr "" -#: src/pages/applications/ApplicationListPage.ts:114 +#: src/pages/applications/ApplicationListPage.ts:119 #: src/pages/providers/RelatedApplicationButton.ts:30 msgid "Create Application" msgstr "" @@ -778,7 +782,7 @@ msgstr "" #: src/pages/policies/PolicyListPage.ts:136 #: src/pages/property-mappings/PropertyMappingListPage.ts:125 #: src/pages/providers/ProviderListPage.ts:119 -#: src/pages/sources/SourcesListPage.ts:112 +#: src/pages/sources/SourcesListPage.ts:127 #: src/pages/stages/StageListPage.ts:131 msgid "Create {0}" msgstr "" @@ -822,7 +826,7 @@ msgid "Define how notifications are sent to users, like Email or Webhook." msgstr "" #: src/elements/forms/DeleteForm.ts:79 -#: src/pages/applications/ApplicationListPage.ts:102 +#: src/pages/applications/ApplicationListPage.ts:107 #: src/pages/crypto/CertificateKeyPairListPage.ts:86 #: src/pages/events/RuleListPage.ts:82 #: src/pages/events/TransportListPage.ts:86 @@ -833,7 +837,7 @@ msgstr "" #: src/pages/policies/PolicyListPage.ts:115 #: src/pages/property-mappings/PropertyMappingListPage.ts:104 #: src/pages/providers/ProviderListPage.ts:98 -#: src/pages/sources/SourcesListPage.ts:91 +#: src/pages/sources/SourcesListPage.ts:106 #: src/pages/stages/StageListPage.ts:110 #: src/pages/stages/invitation/InvitationListPage.ts:68 #: src/pages/stages/prompt/PromptListPage.ts:87 @@ -935,7 +939,7 @@ msgstr "" msgid "Disable Time-based OTP" msgstr "" -#: src/pages/sources/SourcesListPage.ts:60 +#: src/pages/sources/SourcesListPage.ts:75 msgid "Disabled" msgstr "" @@ -972,7 +976,7 @@ msgstr "" #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:139 #: src/pages/providers/proxy/ProxyProviderViewPage.ts:138 #: src/pages/providers/saml/SAMLProviderViewPage.ts:132 -#: src/pages/sources/SourcesListPage.ts:79 +#: src/pages/sources/SourcesListPage.ts:94 #: src/pages/sources/ldap/LDAPSourceViewPage.ts:116 #: src/pages/sources/oauth/OAuthSourceViewPage.ts:135 #: src/pages/sources/saml/SAMLSourceViewPage.ts:122 @@ -1588,8 +1592,8 @@ msgstr "" msgid "Last seen: {0}" msgstr "" -#: src/pages/admin-overview/cards/LDAPSyncStatusCard.ts:23 -#: src/pages/sources/ldap/LDAPSourceViewPage.ts:150 +#: src/pages/admin-overview/cards/LDAPSyncStatusCard.ts:25 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:154 msgid "Last sync: {0}" msgstr "" @@ -1946,11 +1950,11 @@ msgstr "" msgid "Not found" msgstr "" -#: src/pages/sources/ldap/LDAPSourceViewPage.ts:148 -msgid "Not synced in the last hour, check System tasks." +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:165 +msgid "Not synced yet." msgstr "" -#: src/pages/admin-overview/cards/LDAPSyncStatusCard.ts:32 +#: src/pages/admin-overview/cards/LDAPSyncStatusCard.ts:40 msgid "Not synced." msgstr "" @@ -2039,6 +2043,10 @@ msgstr "" msgid "Only send notification once, for example when sending a webhook into a chat channel." msgstr "" +#: src/pages/applications/ApplicationListPage.ts:95 +msgid "Open application" +msgstr "" + #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:172 msgid "OpenID Configuration Issuer" msgstr "" @@ -2468,7 +2476,7 @@ msgstr "" msgid "Result" msgstr "" -#: src/pages/sources/ldap/LDAPSourceViewPage.ts:163 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:177 #: src/pages/system-tasks/SystemTaskListPage.ts:107 msgid "Retry Task" msgstr "" @@ -2585,7 +2593,7 @@ msgstr "" msgid "Select a provider that this application should use. Alternatively, create a new provider." msgstr "" -#: src/elements/table/Table.ts:215 +#: src/elements/table/Table.ts:218 msgid "Select all rows" msgstr "" @@ -2722,7 +2730,7 @@ msgid "Something went wrong! Please try again later." msgstr "" #: src/pages/providers/ProviderListPage.ts:91 -#: src/pages/sources/SourcesListPage.ts:84 +#: src/pages/sources/SourcesListPage.ts:99 msgid "Source" msgstr "" @@ -3097,6 +3105,10 @@ msgstr "" msgid "Sync" msgstr "" +#: src/pages/admin-overview/cards/LDAPSyncStatusCard.ts:31 +msgid "Sync failed." +msgstr "" + #: src/pages/sources/ldap/LDAPSourceForm.ts:93 msgid "Sync groups" msgstr "" @@ -3138,6 +3150,14 @@ msgstr "" msgid "Target" msgstr "" +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:151 +msgid "Task finished with errors" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:148 +msgid "Task finished with warnings" +msgstr "" + #: src/pages/stages/email/EmailStageForm.ts:157 msgid "Template" msgstr "" @@ -3345,7 +3365,7 @@ msgstr "" #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:129 #: src/pages/providers/proxy/ProxyProviderViewPage.ts:128 #: src/pages/providers/saml/SAMLProviderViewPage.ts:122 -#: src/pages/sources/SourcesListPage.ts:66 +#: src/pages/sources/SourcesListPage.ts:81 #: src/pages/sources/ldap/LDAPSourceViewPage.ts:106 #: src/pages/sources/oauth/OAuthSourceViewPage.ts:125 #: src/pages/sources/saml/SAMLSourceViewPage.ts:112 @@ -3448,7 +3468,7 @@ msgstr "" #: src/pages/policies/PolicyListPage.ts:80 #: src/pages/property-mappings/PropertyMappingListPage.ts:69 #: src/pages/providers/ProviderListPage.ts:76 -#: src/pages/sources/SourcesListPage.ts:69 +#: src/pages/sources/SourcesListPage.ts:84 #: src/pages/stages/StageListPage.ts:88 #: src/pages/users/UserActiveForm.ts:41 msgid "Update {0}" @@ -3708,6 +3728,10 @@ msgstr "" msgid "You're currently impersonating {0}." msgstr "" +#: src/pages/sources/SourcesListPage.ts:61 +msgid "authentik Built-in" +msgstr "" + #: src/pages/stages/password/PasswordStageForm.ts:76 msgid "authentik Builtin Database" msgstr "" diff --git a/web/src/pages/admin-overview/cards/LDAPSyncStatusCard.ts b/web/src/pages/admin-overview/cards/LDAPSyncStatusCard.ts index 690eb2d64..ba92dd9c3 100644 --- a/web/src/pages/admin-overview/cards/LDAPSyncStatusCard.ts +++ b/web/src/pages/admin-overview/cards/LDAPSyncStatusCard.ts @@ -1,32 +1,40 @@ import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AdminStatus, AdminStatusCard } from "./AdminStatusCard"; -import { SourcesApi } from "authentik-api"; +import { SourcesApi, Task, TaskStatusEnum } from "authentik-api"; import { DEFAULT_CONFIG } from "../../../api/Config"; import "../../../elements/forms/ConfirmationForm"; @customElement("ak-admin-status-card-ldap-sync") -export class LDAPSyncStatusCard extends AdminStatusCard { +export class LDAPSyncStatusCard extends AdminStatusCard { @property() slug!: string; - getPrimaryValue(): Promise { + getPrimaryValue(): Promise { return new SourcesApi(DEFAULT_CONFIG).sourcesLdapSyncStatus({ slug: this.slug }).then((value) => { - return value.lastSync; + return value; + }).catch(() => { + return { status: TaskStatusEnum.Error } as Task; }); } renderValue(): TemplateResult { - return html`${t`Last sync: ${this.value?.toLocaleTimeString()}`}`; + return html`${t`Last sync: ${this.value?.taskFinishTimestamp.toLocaleTimeString()}`}`; } - getStatus(value: Date | undefined): Promise { + getStatus(value: Task): Promise { + if (value.status !== TaskStatusEnum.Successful) { + return Promise.resolve({ + icon: "fa fas fa-times-circle pf-m-danger", + message: t`Sync failed.`, + }); + } const now = new Date().getTime(); const maxDelta = 3600000; // 1 hour - if (!value || (now - value.getTime()) > maxDelta) { + if (!value || (now - value.taskFinishTimestamp.getTime()) > maxDelta) { // No sync or last sync was over maxDelta ago return Promise.resolve({ icon: "fa fa-exclamation-triangle pf-m-warning", diff --git a/web/src/pages/sources/ldap/LDAPSourceViewPage.ts b/web/src/pages/sources/ldap/LDAPSourceViewPage.ts index b6b96abd5..782843f56 100644 --- a/web/src/pages/sources/ldap/LDAPSourceViewPage.ts +++ b/web/src/pages/sources/ldap/LDAPSourceViewPage.ts @@ -22,7 +22,7 @@ import "../../../elements/forms/ModalForm"; import "./LDAPSourceForm"; import { Page } from "../../../elements/Page"; import { until } from "lit-html/directives/until"; -import { LDAPSource, SourcesApi } from "authentik-api"; +import { LDAPSource, SourcesApi, TaskStatusEnum } from "authentik-api"; import { DEFAULT_CONFIG } from "../../../api/Config"; import { EVENT_REFRESH } from "../../../constants"; @@ -143,16 +143,28 @@ export class LDAPSourceViewPage extends Page {

${t`Sync status`}

-

${until(new SourcesApi(DEFAULT_CONFIG).sourcesLdapSyncStatus({ slug: this.source.slug }).then((ls) => { - if (!ls.lastSync) { - return t`Not synced in the last hour, check System tasks.`; + let header = html``; + if (ls.status === TaskStatusEnum.Warning) { + header = html`

${t`Task finished with warnings`}

`; + } else if (status === TaskStatusEnum.Error) { + header = html`

${t`Task finished with errors`}

`; + } else { + header = html`

${t`Last sync: ${ls.taskFinishTimestamp.toLocaleString()}`}

`; } - return t`Last sync: ${ls.lastSync.toLocaleString()}`; + return html` + ${header} +
    + ${ls.messages.map(m => { + return html`
  • ${m}
  • `; + })} +
+ `; + }).catch(() => { + return html`

${t`Not synced yet.`}

`; }), "loading")} -