diff --git a/entry/src/main/ets/common/utils/AuthUtils.ts b/entry/src/main/ets/common/utils/AuthUtils.ts index 53774fd0ac379548f1e10ada747e7727f78b57de..b563f84b079007b74e1941c8d6d53b411810ffdc 100644 --- a/entry/src/main/ets/common/utils/AuthUtils.ts +++ b/entry/src/main/ets/common/utils/AuthUtils.ts @@ -15,13 +15,15 @@ import userAuth from '@ohos.userIAM.userAuth'; import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'; -import Constants from '../vm/Constants'; +import Constants, { TipCode } from '../vm/Constants'; import LogUtils from './LogUtils'; +import JSON from '@ohos.util.json'; const TAG = 'AuthUtils'; export default class AuthUtils { private static authUtilsInstance: AuthUtils; + private widgetContextId: bigint = BigInt(AppStorage.get('widgetContextId')) ?? BigInt(-1); public static getInstance(): AuthUtils { if (!AuthUtils.authUtilsInstance) { @@ -30,16 +32,19 @@ export default class AuthUtils { return AuthUtils.authUtilsInstance; } - sendNotice(cmd: string, type: Array): void { + sendNotice(cmd: string, type: Array, tipCode: TipCode = TipCode.NORMAL): void { try { const eventData = { - widgetContextId: AppStorage.get('widgetContextId'), + widgetContextId: this.widgetContextId, event: cmd, version: Constants.noticeVersion, payload: { - type: type + type: type, + tipCode: tipCode } }; + LogUtils.info(TAG, 'widgetContextId: ' + this.widgetContextId); + LogUtils.info(TAG, 'tipCode: ' + tipCode); const jsonEventData = JSON.stringify(eventData); LogUtils.info(TAG, 'sendNotice start eventData: ' + jsonEventData); userAuth.sendNotice(userAuth.NoticeType.WIDGET_NOTICE, jsonEventData); diff --git a/entry/src/main/ets/common/utils/FuncUtils.ts b/entry/src/main/ets/common/utils/FuncUtils.ts index 4049065f7fdc2f8012cb00b25b28c7da71ef325d..0b4d3032ebe9b35590457f0b3dadf9d7e7ae7f19 100644 --- a/entry/src/main/ets/common/utils/FuncUtils.ts +++ b/entry/src/main/ets/common/utils/FuncUtils.ts @@ -28,6 +28,10 @@ export class FuncUtils { return textEncoder.encode(value); } + getStringFromCharCode(input: Uint8Array): string { + return String.fromCharCode(...input); + } + getDialogType(type: Array): DialogType { if (type) { if (type.includes(userAuth.UserAuthType.PIN)) { diff --git a/entry/src/main/ets/common/vm/Constants.ts b/entry/src/main/ets/common/vm/Constants.ts index 2cad77f3d1675e47740535a05a33d0131dfa830c..c99fbb29c2286ff928a8e4df061f7adc7db42969 100644 --- a/entry/src/main/ets/common/vm/Constants.ts +++ b/entry/src/main/ets/common/vm/Constants.ts @@ -48,6 +48,8 @@ export default class Constants { static noticeEventWidgetLoaded = 'EVENT_AUTH_WIDGET_LOADED'; static noticeEventWidgetReleased = 'EVENT_AUTH_WIDGET_RELEASED'; static noticeEventUserNavigation = 'EVENT_AUTH_USER_NAVIGATION'; + static noticeEventProcessTerminate = 'EVENT_AUTH_PROCESS_TERMINATE'; + static noticeEventAuthSendTip = 'EVENT_AUTH_SEND_TIP'; static numKeyBoard : NumKeyBoardItem[] = [ { @@ -149,7 +151,9 @@ export interface CmdData { remainAttempts: number, lockoutDuration: number, result: number, - sensorInfo?: string + sensorInfo?: string, + tipType?: number, + tipInfo?: Uint8Array } export interface CmdType { @@ -173,6 +177,7 @@ export interface WantParams { navigationButtonText?: string, windowModeType: string, cmd: CmdType[], + widgetContextIdStr?: string, } export interface WidgetCommand { @@ -189,4 +194,14 @@ export enum CmdNotifyEvents { CMD_NOTIFY_AUTH_START = 'CMD_NOTIFY_AUTH_START', CMD_NOTIFY_AUTH_RESULT = 'CMD_NOTIFY_AUTH_RESULT', CMD_NOTIFY_AUTH_TIP = 'CMD_NOTIFY_AUTH_TIP' -} \ No newline at end of file +} + +export enum TipCode { + NORMAL = -1, + // 超时 + TIMEOUT = 2, + // 临时冻结 + TEMPORARILY_LOCKED = 3, + // 永久冻结 + PERMANENTLY_LOCKED = 4, +} diff --git a/entry/src/main/ets/extensionability/UserAuthAbility.ts b/entry/src/main/ets/extensionability/UserAuthAbility.ts index 36bb785a9c722cad1f4c10864e31adde6e67e2ff..7390e63d8bb0f0984e97b2671a4772823c8c1290 100644 --- a/entry/src/main/ets/extensionability/UserAuthAbility.ts +++ b/entry/src/main/ets/extensionability/UserAuthAbility.ts @@ -17,7 +17,8 @@ import LogUtils from '../common/utils/LogUtils'; import UserAuthExtensionAbility from '@ohos.app.ability.UserAuthExtensionAbility'; import WindowPrivacyUtils from '../common/utils/WindowPrivacyUtils'; import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'; -import { WantParams } from '../common/vm/Constants'; +import Constants, { WantParams } from '../common/vm/Constants'; +import AuthUtils from '../common/utils/AuthUtils'; const TAG = 'UserAuthAbility'; // The current interface only support string type @@ -63,6 +64,7 @@ export default class UserAuthAbility extends UserAuthExtensionAbility { onSessionDestroy(session): void { LogUtils.info(TAG, 'UserAuthExtensionAbility onSessionDestroy'); + AuthUtils.getInstance().sendNotice(Constants.noticeEventProcessTerminate, [Constants.noticeTypePin]); WindowPrivacyUtils.setWindowPrivacyMode(session, false); } } diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index bf88e8ef2445e0978d673886c015f6d7601715b8..09bc862064560cbeb4ba1b467f8e88de01b9ea52 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -215,7 +215,9 @@ struct Index { return userAuth.UserAuthType.PIN; } }) - AppStorage.setOrCreate('widgetContextId', resultInfo?.widgetContextId); + AppStorage.setOrCreate('widgetContextId', resultInfo?.widgetContextIdStr); + LogUtils.info(TAG, '==============widgetContextId: ' + resultInfo?.widgetContextId); + LogUtils.info(TAG, '==============widgetContextIdStr: ' + resultInfo?.widgetContextIdStr); this.authType = newType; this.type = resultInfo?.type; this.windowModeType = resultInfo?.windowModeType; diff --git a/entry/src/main/ets/pages/components/FaceAuth.ets b/entry/src/main/ets/pages/components/FaceAuth.ets index 28b0641ce49c161b80550d5d0bb73be14831af41..899813214f551300d3e514c0db6083da3cc906b4 100644 --- a/entry/src/main/ets/pages/components/FaceAuth.ets +++ b/entry/src/main/ets/pages/components/FaceAuth.ets @@ -249,7 +249,9 @@ export default struct FaceAuth { if (payload.type === Constants.noticeTypePin) { if (payload.result === 0) { AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); - (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + setTimeout(() => { + (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + }, SECOND); } else if (payload.result && payload.result === Constants.authResultPinExpired) { this.inputValue = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_pwd_error').id); @@ -320,13 +322,15 @@ export default struct FaceAuth { AuthUtils.getInstance() .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace]); } - (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + setTimeout(() => { + (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + }, SECOND); } } else if (payload.type === Constants.noticeTypeFinger) { const payload: CmdData = item.payload; - let lockoutDuration: number; - let remainAttempts: number; - let authResult: number; + let lockoutDuration: number = 0; + let remainAttempts: number = 0; + let authResult: number = 0; if (item?.event === CmdNotifyEvents.CMD_NOTIFY_AUTH_TIP) { const tipInfo: string = FuncUtils.getStringFromCharCode(payload.tipInfo); if (tipInfo) { @@ -412,7 +416,9 @@ export default struct FaceAuth { AuthUtils.getInstance() .sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFace, Constants.noticeTypeFinger]); } - (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + setTimeout(() => { + (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + }, SECOND); } } else { LogUtils.error(TAG, 'onCmdDataChange default'); diff --git a/entry/src/main/ets/pages/components/FingerprintAuth.ets b/entry/src/main/ets/pages/components/FingerprintAuth.ets index 8102f7f9c9bd009eaa1f9ce3255b09b1f1e73b76..e13f527ee3bbb4fc4f0ceed60913d3337c1ae029 100644 --- a/entry/src/main/ets/pages/components/FingerprintAuth.ets +++ b/entry/src/main/ets/pages/components/FingerprintAuth.ets @@ -29,7 +29,8 @@ import Constants, { CmdType, FingerPosition, UserAuthTipType, - WantParams + WantParams, + TipCode } from '../../common/vm/Constants'; import common from '@ohos.app.ability.common'; @@ -54,6 +55,7 @@ const ON_SCREEN = 1; const UNDER_SCREEN = 2; const FINGER_SENSOR_POSITION_LINE = 0.75; const SECOND = 1000; +export const AUTH_LOCK_TIME: number = 2147483647; @Component export default struct FingerprintAuth { @@ -79,6 +81,7 @@ export default struct FingerprintAuth { @State isOffFinger: boolean = false; @State screenType: number = 0; @Link skipLockedBiometricAuth: boolean; + private fingerprintTipCode: TipCode = TipCode.NORMAL; aboutToAppear(): void { AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); @@ -121,6 +124,9 @@ export default struct FingerprintAuth { } } } + if (this.fingerprintTipCode !== TipCode.NORMAL) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventAuthSendTip, [Constants.noticeTypeFinger], this.fingerprintTipCode); + } } catch (error) { LogUtils.error(TAG, 'aboutToAppear PINAuth catch error: ' + error?.code); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); @@ -138,34 +144,47 @@ export default struct FingerprintAuth { onCmdDataChange(num?: string): void { this.cmdData.length > 0 && this.cmdData.map((item) => { + LogUtils.error(TAG, `item: ${JSON.stringify(item)}`); const payload: CmdData = item.payload; - let lockoutDuration: number; - let remainAttempts: number; - let authResult: number; - if (item?.event === CmdNotifyEvents.CMD_NOTIFY_AUTH_TIP) { - const tipInfo: string = FuncUtils.getStringFromCharCode(payload.tipInfo); - if (tipInfo) { - lockoutDuration = JSON.parse(tipInfo).lockoutDuration as number; - remainAttempts = JSON.parse(tipInfo).authRemainAttempts as number; - authResult = JSON.parse(tipInfo).authResult as number; + let lockoutDuration: number = 0; + let remainAttempts: number = 0; + let authResult: number = -1; + LogUtils.error(TAG, `payload: ${JSON.stringify(payload)}`); + if (payload.type === Constants.noticeTypeFinger){ + if (item?.event === CmdNotifyEvents.CMD_NOTIFY_AUTH_TIP) { + const tipInfo: string = FuncUtils.getStringFromCharCode(payload.tipInfo); + if (tipInfo) { + lockoutDuration = JSON.parse(tipInfo).lockoutDuration as number; + remainAttempts = JSON.parse(tipInfo).authRemainAttempts as number; + authResult = JSON.parse(tipInfo).authResult as number; + LogUtils.error(TAG, `====================0===================`); + } else { + LogUtils.error(TAG, `====================1===================`); + return; + } } else { - return; + LogUtils.error(TAG, `====================2===================`); + lockoutDuration = payload.lockoutDuration ?? 10000; + remainAttempts = payload.remainAttempts; + authResult = payload.result ?? -1; } - } else { + } else if (payload.type === Constants.noticeTypePin){ + LogUtils.error(TAG, `====================3===================`); lockoutDuration = payload.lockoutDuration; remainAttempts = payload.remainAttempts; - if (payload.result) { - authResult = payload.result; - } else { - authResult = -1; - } + authResult = payload.result; + } else { + LogUtils.error(TAG, `====================4===================`); + return; } LogUtils.info(TAG, `lockoutDuration: ${lockoutDuration} remainAttempts: ${remainAttempts} authResult: ${authResult}`); if (payload.type === Constants.noticeTypePin) { if (authResult === 0) { AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); - (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + setTimeout(() => { + (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + }, SECOND) } else if (authResult && authResult === Constants.authResultPinExpired) { this.inputValue = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_pwd_error').id); @@ -231,6 +250,13 @@ export default struct FingerprintAuth { $r('app.string.unified_authwidget_hint_inscreen_fp').id); } if (remainAttempts === AUTH_LOCK) { + if (num === 'first') { + if (lockoutDuration === AUTH_LOCK_TIME) { + this.fingerprintTipCode = TipCode.PERMANENTLY_LOCKED; + } else { + this.fingerprintTipCode = TipCode.TEMPORARILY_LOCKED; + } + } this.prompt = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden').id); this.fingerLock = true; @@ -276,7 +302,9 @@ export default struct FingerprintAuth { if (payload.tipType === UserAuthTipType.SINGLE_AUTH_RESULT) { AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); } - (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + setTimeout(() => { + (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + }, SECOND); } } else { LogUtils.error(TAG, 'onCmdDataChange default'); diff --git a/entry/src/main/ets/pages/components/PasswordAuth.ets b/entry/src/main/ets/pages/components/PasswordAuth.ets index 8721c0046c806b79a158b1068615f2998df03a0e..52ecb9f15502ea99b7b9a1d5b619f462e6ae5a5c 100644 --- a/entry/src/main/ets/pages/components/PasswordAuth.ets +++ b/entry/src/main/ets/pages/components/PasswordAuth.ets @@ -117,7 +117,6 @@ export default struct PasswordAuth { aboutToDisappear(): void { LogUtils.info(TAG, 'aboutToAppear pinAuthManager unregisterInputer'); - AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); pinAuthManager?.unregisterInputer?.(); } @@ -138,8 +137,9 @@ export default struct PasswordAuth { } handleCancel(): void { - AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, [] || - (AppStorage.get('wantParams') as WantParams)?.type as string[]); + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventCancel, (AppStorage.get('wantParams') as WantParams)?.type as string[]); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); }