diff --git a/scripts/langindex.json b/scripts/langindex.json index 6507a0414..c999b7a30 100644 --- a/scripts/langindex.json +++ b/scripts/langindex.json @@ -2340,6 +2340,7 @@ "core.userdeleted": "moodle", "core.userdetails": "moodle", "core.usernotfullysetup": "error", + "core.usernologin": "local_moodlemobileapp", "core.users": "moodle", "core.usersuspended": "tool_reportbuilder", "core.view": "moodle", diff --git a/src/core/classes/site.ts b/src/core/classes/site.ts index d95590192..0c91b0466 100644 --- a/src/core/classes/site.ts +++ b/src/core/classes/site.ts @@ -631,6 +631,12 @@ export class CoreSite { CoreEvents.trigger(CoreEvents.USER_SUSPENDED, { params: data }, this.id); error.message = Translate.instant('core.usersuspended'); + throw new CoreWSError(error); + } else if (error.errorcode === 'wsaccessusernologin') { + // User suspended, trigger event. + CoreEvents.trigger(CoreEvents.USER_NO_LOGIN, { params: data }, this.id); + error.message = Translate.instant('core.usernologin'); + throw new CoreWSError(error); } else if (error.errorcode === 'forcepasswordchangenotice') { // Password Change Forced, trigger event. Try to get data from cache, the event will handle the error. diff --git a/src/core/features/user/services/user.ts b/src/core/features/user/services/user.ts index c74c9642d..72dfc469e 100644 --- a/src/core/features/user/services/user.ts +++ b/src/core/features/user/services/user.ts @@ -63,6 +63,7 @@ export class CoreUserProvider { CoreEvents.on(CoreEvents.USER_DELETED, data => this.handleUserKickedOutEvent(data)); CoreEvents.on(CoreEvents.USER_SUSPENDED, data => this.handleUserKickedOutEvent(data)); + CoreEvents.on(CoreEvents.USER_NO_LOGIN, data => this.handleUserKickedOutEvent(data)); } /** diff --git a/src/core/lang.json b/src/core/lang.json index e20334ff9..982c01ba1 100644 --- a/src/core/lang.json +++ b/src/core/lang.json @@ -327,7 +327,8 @@ "userdeleted": "This user account has been deleted", "userdetails": "User details", "usernotfullysetup": "User not fully set-up", - "usersuspended": "This user account has been suspended", + "usernologin": "Authentication has been revoked for this account", + "usersuspended": "Registration suspended", "users": "Users", "view": "View", "viewcode": "View code", diff --git a/src/core/singletons/events.ts b/src/core/singletons/events.ts index 8eb15caba..547acc270 100644 --- a/src/core/singletons/events.ts +++ b/src/core/singletons/events.ts @@ -45,6 +45,7 @@ export interface CoreEventsData { [CoreEvents.PACKAGE_STATUS_CHANGED]: CoreEventPackageStatusChanged; [CoreEvents.USER_DELETED]: CoreEventUserDeletedData; [CoreEvents.USER_SUSPENDED]: CoreEventUserSuspendedData; + [CoreEvents.USER_NO_LOGIN]: CoreEventUserNoLoginData; [CoreEvents.FORM_ACTION]: CoreEventFormActionData; [CoreEvents.NOTIFICATION_SOUND_CHANGED]: CoreEventNotificationSoundChangedData; [CoreEvents.SELECT_COURSE_TAB]: CoreEventSelectCourseTabData; @@ -87,6 +88,7 @@ export class CoreEvents { static readonly COMPLETION_CHANGED = 'completion_changed'; static readonly USER_DELETED = 'user_deleted'; static readonly USER_SUSPENDED = 'user_suspended'; + static readonly USER_NO_LOGIN = 'user_no_login'; static readonly PACKAGE_STATUS_CHANGED = 'package_status_changed'; static readonly COURSE_STATUS_CHANGED = 'course_status_changed'; static readonly SECTION_STATUS_CHANGED = 'section_status_changed'; @@ -315,6 +317,14 @@ export type CoreEventUserSuspendedData = { params: any; // Params sent to the WS that failed. }; +/** + * Data passed to USER_NO_LOGIN event. + */ +export type CoreEventUserNoLoginData = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + params: any; // Params sent to the WS that failed. +}; + export enum CoreEventFormAction { CANCEL = 'cancel', SUBMIT = 'submit',