1df226684Sopenharmony_ci/* 2df226684Sopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 3df226684Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4df226684Sopenharmony_ci * you may not use this file except in compliance with the License. 5df226684Sopenharmony_ci * You may obtain a copy of the License at 6df226684Sopenharmony_ci * 7df226684Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8df226684Sopenharmony_ci * 9df226684Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10df226684Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11df226684Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12df226684Sopenharmony_ci * See the License for the specific language governing permissions and 13df226684Sopenharmony_ci * limitations under the License. 14df226684Sopenharmony_ci */ 15df226684Sopenharmony_ci 16df226684Sopenharmony_ciimport ServiceExtensionAbility from '@ohos.app.ability.ServiceExtensionAbility'; 17df226684Sopenharmony_ciimport dlpPermission from '@ohos.dlpPermission'; 18df226684Sopenharmony_ciimport fileio from '@ohos.fileio'; 19df226684Sopenharmony_ciimport Want from '@ohos.app.ability.Want'; 20df226684Sopenharmony_ciimport hiTraceMeter from '@ohos.hiTraceMeter'; 21df226684Sopenharmony_ciimport hiSysEvent from '@ohos.hiSysEvent'; 22df226684Sopenharmony_ciimport wantConstant from '@ohos.app.ability.wantConstant'; 23df226684Sopenharmony_ciimport fs from '@ohos.file.fs'; 24df226684Sopenharmony_ciimport fileUri from '@ohos.file.fileuri'; 25df226684Sopenharmony_ciimport { BusinessError } from '@ohos.base'; 26df226684Sopenharmony_ciimport osAccount from '@ohos.account.osAccount'; 27df226684Sopenharmony_ciimport uriPermissionManager from '@ohos.application.uriPermissionManager'; 28df226684Sopenharmony_ciimport { 29df226684Sopenharmony_ci getOsAccountInfo, 30df226684Sopenharmony_ci getUserId, 31df226684Sopenharmony_ci checkDomainAccountInfo, 32df226684Sopenharmony_ci getAuthPerm, 33df226684Sopenharmony_ci getFileFd, 34df226684Sopenharmony_ci getFileUriByPath, 35df226684Sopenharmony_ci getAppId, 36df226684Sopenharmony_ci DLPInfo, 37df226684Sopenharmony_ci getDLPInfo, 38df226684Sopenharmony_ci sendDlpFileOpenProperties, 39df226684Sopenharmony_ci isValidPath, 40df226684Sopenharmony_ci defaultDlpFile, 41df226684Sopenharmony_ci getAccountType, 42df226684Sopenharmony_ci checkNetworkStatus 43df226684Sopenharmony_ci} from '../common/utils'; 44df226684Sopenharmony_ciimport { 45df226684Sopenharmony_ci DlpFileInfo, 46df226684Sopenharmony_ci deleteSandbox2linkFileData, 47df226684Sopenharmony_ci deleteFileOpenHistoryData, 48df226684Sopenharmony_ci deleteLinkSetData, 49df226684Sopenharmony_ci deleteToken2FileData, 50df226684Sopenharmony_ci getDlpFileInfoFromSandbox2linkFileData, 51df226684Sopenharmony_ci} from '../common/DataUtils'; 52df226684Sopenharmony_ciimport Constants from '../common/constant'; 53df226684Sopenharmony_ciimport GlobalContext from '../common/GlobalContext'; 54df226684Sopenharmony_ciimport rpc from '@ohos.rpc'; 55df226684Sopenharmony_ciimport { GetAlertMessage } from '../common/GetAlertMessage'; 56df226684Sopenharmony_ciimport { HiLog } from '../common/HiLog'; 57df226684Sopenharmony_ciimport { ObjectUtil } from '../common/ObjectUtil'; 58df226684Sopenharmony_ciimport AccountManager from '../manager/AccountManager'; 59df226684Sopenharmony_ci 60df226684Sopenharmony_ciconst TAG = 'View'; 61df226684Sopenharmony_ciconst SUFFIX_INDEX = 2; 62df226684Sopenharmony_ci 63df226684Sopenharmony_ciinterface DlpConnectionPluginIdObj { 64df226684Sopenharmony_ci id: string 65df226684Sopenharmony_ci} 66df226684Sopenharmony_ci 67df226684Sopenharmony_cilet opening: boolean = false; 68df226684Sopenharmony_ciexport default class ViewAbility extends ServiceExtensionAbility { 69df226684Sopenharmony_ci private dlpFd: number = -1; 70df226684Sopenharmony_ci private linkFileName: string = ''; 71df226684Sopenharmony_ci private linkFilePath: string = ''; 72df226684Sopenharmony_ci private appIndex: number = -1; 73df226684Sopenharmony_ci private tokenId: number = -1; 74df226684Sopenharmony_ci private dlpFile: dlpPermission.DLPFile = defaultDlpFile; 75df226684Sopenharmony_ci private authPerm: dlpPermission.DLPFileAccess = dlpPermission.DLPFileAccess.READ_ONLY; 76df226684Sopenharmony_ci private needCallAccount: boolean = true; 77df226684Sopenharmony_ci private sandboxBundleName: string = ''; 78df226684Sopenharmony_ci private sandboxAbilityName: string = ''; 79df226684Sopenharmony_ci private sandboxModuleName: string = ''; 80df226684Sopenharmony_ci private fileName: string = ''; 81df226684Sopenharmony_ci private uri: string = ''; 82df226684Sopenharmony_ci private stat?: fs.Stat; 83df226684Sopenharmony_ci private accountInfo?: osAccount.OsAccountInfo; 84df226684Sopenharmony_ci private uriInfo: fileUri.FileUri = new fileUri.FileUri(''); 85df226684Sopenharmony_ci private linkUri: string = ''; 86df226684Sopenharmony_ci private alreadyOpened: boolean = false; 87df226684Sopenharmony_ci private userId: number = -1; 88df226684Sopenharmony_ci private linkFileWriteable: boolean = false; 89df226684Sopenharmony_ci private callerBundleName: string = ''; 90df226684Sopenharmony_ci private accountType: number = dlpPermission.AccountType.DOMAIN_ACCOUNT; 91df226684Sopenharmony_ci private distributedInfoId: string = ''; 92df226684Sopenharmony_ci 93df226684Sopenharmony_ci async onCreate(want: Want): Promise<void> { 94df226684Sopenharmony_ci if (!GlobalContext.load('sandbox2linkFile')) { 95df226684Sopenharmony_ci GlobalContext.store('sandbox2linkFile', new Map<string, (number | string | dlpPermission.DLPFile)[][]>()); 96df226684Sopenharmony_ci } 97df226684Sopenharmony_ci if (!GlobalContext.load('fileOpenHistory')) { 98df226684Sopenharmony_ci GlobalContext.store('fileOpenHistory', new Map<string, (number | string)[]>()); 99df226684Sopenharmony_ci } 100df226684Sopenharmony_ci if (!GlobalContext.load('token2File')) { 101df226684Sopenharmony_ci GlobalContext.store('token2File', new Map<number, (number | string | dlpPermission.DLPFile)[]>()); 102df226684Sopenharmony_ci } 103df226684Sopenharmony_ci if (!GlobalContext.load('linkSet')) { 104df226684Sopenharmony_ci GlobalContext.store('linkSet', new Set<string>()); 105df226684Sopenharmony_ci } 106df226684Sopenharmony_ci let dlpInfo: DLPInfo = await getDLPInfo(); 107df226684Sopenharmony_ci AppStorage.setOrCreate('hiPNameId', dlpInfo.name); 108df226684Sopenharmony_ci AppStorage.setOrCreate('hiPVersionId', dlpInfo.versionCode); 109df226684Sopenharmony_ci AppStorage.setOrCreate('viewContext', this.context); 110df226684Sopenharmony_ci 111df226684Sopenharmony_ci AccountManager.connectAbility(this.context); 112df226684Sopenharmony_ci } 113df226684Sopenharmony_ci 114df226684Sopenharmony_ci async terminateCall(): Promise<void> { 115df226684Sopenharmony_ci return new Promise((resolve, reject) => { 116df226684Sopenharmony_ci let sandbox2linkFile: Map<string, (number | string | dlpPermission.DLPFile)[][]> = 117df226684Sopenharmony_ci GlobalContext.load('sandbox2linkFile') as Map<string, (number | string | dlpPermission.DLPFile)[][]>; 118df226684Sopenharmony_ci HiLog.debug(TAG, `sandbox2linkFile size: ${sandbox2linkFile.size}`); 119df226684Sopenharmony_ci if (sandbox2linkFile.size === 0) { 120df226684Sopenharmony_ci this.context.terminateSelf(); 121df226684Sopenharmony_ci } 122df226684Sopenharmony_ci reject(); 123df226684Sopenharmony_ci return; 124df226684Sopenharmony_ci }); 125df226684Sopenharmony_ci } 126df226684Sopenharmony_ci 127df226684Sopenharmony_ci async startDataAbility(): Promise<void> { 128df226684Sopenharmony_ci let want: Want = { 129df226684Sopenharmony_ci bundleName: Constants.DLP_MANAGER_BUNDLE_NAME, 130df226684Sopenharmony_ci abilityName: 'DataAbility' 131df226684Sopenharmony_ci }; 132df226684Sopenharmony_ci try { 133df226684Sopenharmony_ci await this.context.startAbility(want); 134df226684Sopenharmony_ci } catch { 135df226684Sopenharmony_ci HiLog.info(TAG, `startDataAbility failed`); 136df226684Sopenharmony_ci } 137df226684Sopenharmony_ci } 138df226684Sopenharmony_ci 139df226684Sopenharmony_ci startAbility(want: Want, startId: number): void { 140df226684Sopenharmony_ci HiLog.info(TAG, `start sandbox begin`); 141df226684Sopenharmony_ci this.context.startAbility(want, async (err) => { 142df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpStartSandboxJs', startId); 143df226684Sopenharmony_ci if (err && err.code !== 0) { 144df226684Sopenharmony_ci HiLog.error(TAG, `startSandboxApp failed: ${JSON.stringify(err)}`); 145df226684Sopenharmony_ci try { 146df226684Sopenharmony_ci await this.dlpFile.deleteDLPLinkFile(this.linkFileName); 147df226684Sopenharmony_ci } catch (err) { 148df226684Sopenharmony_ci HiLog.error(TAG, `dlpFile deleteDLPLinkFile failed: ${JSON.stringify(err)}`); 149df226684Sopenharmony_ci } 150df226684Sopenharmony_ci try { 151df226684Sopenharmony_ci await this.dlpFile.closeDLPFile(); 152df226684Sopenharmony_ci } catch (err) { 153df226684Sopenharmony_ci HiLog.error(TAG, `dlpFile closeDLPFile failed: ${JSON.stringify(err)}`); 154df226684Sopenharmony_ci } 155df226684Sopenharmony_ci opening = false; 156df226684Sopenharmony_ci //when errCode is ERR_JS_APP_NOT_EXIST, delete info. 157df226684Sopenharmony_ci if (err.code === Constants.ERR_JS_APP_NOT_EXIST) { 158df226684Sopenharmony_ci await this.deleteData(true, false); 159df226684Sopenharmony_ci } 160df226684Sopenharmony_ci await GetAlertMessage.requestModalUIExtension(this.context, 161df226684Sopenharmony_ci {code: Constants.ERR_JS_APP_INSIDE_ERROR } as BusinessError); 162df226684Sopenharmony_ci await this.sendDlpFileOpenFault(Constants.DLP_START_SANDBOX_ERROR, this.sandboxBundleName, this.appIndex, 163df226684Sopenharmony_ci undefined); // 105: DLP_START_SANDBOX_ERROR 164df226684Sopenharmony_ci } else { 165df226684Sopenharmony_ci // 203: DLP_START_SANDBOX_SUCCESS 166df226684Sopenharmony_ci await this.sendDlpFileOpenEvent(Constants.DLP_START_SANDBOX_SUCCESS, this.sandboxBundleName, this.appIndex); 167df226684Sopenharmony_ci let sandbox2linkFile: Map<string, (number | string | dlpPermission.DLPFile)[][]> = 168df226684Sopenharmony_ci GlobalContext.load('sandbox2linkFile') as Map<string, (number | string | dlpPermission.DLPFile)[][]>; 169df226684Sopenharmony_ci if (!sandbox2linkFile.has(this.sandboxBundleName + this.appIndex)) { 170df226684Sopenharmony_ci sandbox2linkFile.set(this.sandboxBundleName + this.appIndex, []); 171df226684Sopenharmony_ci } 172df226684Sopenharmony_ci if (!this.alreadyOpened) { 173df226684Sopenharmony_ci sandbox2linkFile.get(this.sandboxBundleName + this.appIndex)?.push( 174df226684Sopenharmony_ci [this.dlpFile, this.linkFileName, this.dlpFd, this.tokenId, this.uri]); 175df226684Sopenharmony_ci (GlobalContext.load('fileOpenHistory') as Map<string, (number | string)[]>).set( 176df226684Sopenharmony_ci this.uri, [this.sandboxBundleName, this.appIndex, this.linkFileName, this.linkUri, this.distributedInfoId] 177df226684Sopenharmony_ci ); 178df226684Sopenharmony_ci (GlobalContext.load('token2File') as Map<number, (number | string | dlpPermission.DLPFile | 179df226684Sopenharmony_ci dlpPermission.DLPFileAccess | null)[]>).set(this.tokenId, 180df226684Sopenharmony_ci [this.dlpFile, this.sandboxBundleName, this.appIndex, this.authPerm, this.uri, null, -1]); 181df226684Sopenharmony_ci (GlobalContext.load('linkSet') as Set<string>).add(this.linkUri); 182df226684Sopenharmony_ci } 183df226684Sopenharmony_ci await this.startDataAbility(); 184df226684Sopenharmony_ci opening = false; 185df226684Sopenharmony_ci HiLog.debug(TAG, `startDataAbility success`); 186df226684Sopenharmony_ci } 187df226684Sopenharmony_ci }); 188df226684Sopenharmony_ci } 189df226684Sopenharmony_ci 190df226684Sopenharmony_ci async deleteData(isNeedCloseFd: boolean, isNeedDeleteLink: boolean): Promise<void> { 191df226684Sopenharmony_ci HiLog.info(TAG, `deleteData start`); 192df226684Sopenharmony_ci if (isNeedCloseFd) { 193df226684Sopenharmony_ci try { 194df226684Sopenharmony_ci fileio.closeSync(this.dlpFd); 195df226684Sopenharmony_ci } catch (err) { 196df226684Sopenharmony_ci HiLog.error(TAG, `closeSync failed: ${JSON.stringify(err)}`); 197df226684Sopenharmony_ci } 198df226684Sopenharmony_ci } 199df226684Sopenharmony_ci try { 200df226684Sopenharmony_ci await deleteSandbox2linkFileData(this.sandboxBundleName + this.appIndex, isNeedDeleteLink); 201df226684Sopenharmony_ci await deleteToken2FileData(this.tokenId); 202df226684Sopenharmony_ci await deleteLinkSetData(this.linkUri); 203df226684Sopenharmony_ci await deleteFileOpenHistoryData(this.uri); 204df226684Sopenharmony_ci } catch (err) { 205df226684Sopenharmony_ci HiLog.error(TAG, `deleteData failed`); 206df226684Sopenharmony_ci } 207df226684Sopenharmony_ci } 208df226684Sopenharmony_ci 209df226684Sopenharmony_ci startSandboxApp(startId: number, want: Want): void { 210df226684Sopenharmony_ci startId = Number(startId); 211df226684Sopenharmony_ci hiTraceMeter.startTrace('DlpStartSandboxJs', startId); 212df226684Sopenharmony_ci want.bundleName = this.sandboxBundleName; 213df226684Sopenharmony_ci want.abilityName = this.sandboxAbilityName; 214df226684Sopenharmony_ci want.moduleName = this.sandboxModuleName; 215df226684Sopenharmony_ci want.uri = this.linkUri; 216df226684Sopenharmony_ci want.flags = this.linkFileWriteable ? 217df226684Sopenharmony_ci wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION : wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION; 218df226684Sopenharmony_ci let dlpWant: Want = { 219df226684Sopenharmony_ci parameters: { 220df226684Sopenharmony_ci 'linkFileName': { 221df226684Sopenharmony_ci 'name': this.linkFileName 222df226684Sopenharmony_ci }, 223df226684Sopenharmony_ci 'fileAsset': { 224df226684Sopenharmony_ci 'displayName': this.uriInfo.name, 225df226684Sopenharmony_ci 'relativePath': this.uriInfo.path, 226df226684Sopenharmony_ci 'dateModified': this.stat?.ctime 227df226684Sopenharmony_ci }, 228df226684Sopenharmony_ci 'uri': this.linkUri, 229df226684Sopenharmony_ci 'dlpUri': { 230df226684Sopenharmony_ci 'name': this.uri 231df226684Sopenharmony_ci }, 232df226684Sopenharmony_ci 'linkFileWriteable': { 233df226684Sopenharmony_ci 'name': this.linkFileWriteable 234df226684Sopenharmony_ci }, 235df226684Sopenharmony_ci 'ohos.dlp.params.index': this.appIndex, 236df226684Sopenharmony_ci 'ohos.dlp.params.moduleName': this.sandboxModuleName, 237df226684Sopenharmony_ci 'ohos.dlp.params.securityFlag': this.authPerm === 238df226684Sopenharmony_ci dlpPermission.DLPFileAccess.READ_ONLY ? true : false 239df226684Sopenharmony_ci } 240df226684Sopenharmony_ci }; 241df226684Sopenharmony_ci ObjectUtil.Assign(want.parameters, dlpWant.parameters); 242df226684Sopenharmony_ci this.startAbility(want, startId); 243df226684Sopenharmony_ci } 244df226684Sopenharmony_ci 245df226684Sopenharmony_ci async sendDlpFileOpenFault(code: number, sandboxName: string, appIndex: number, reason?: string): Promise<void> { 246df226684Sopenharmony_ci let event: hiSysEvent.SysEventInfo = { 247df226684Sopenharmony_ci domain: 'DLP', 248df226684Sopenharmony_ci name: 'DLP_FILE_OPEN', 249df226684Sopenharmony_ci eventType: hiSysEvent?.EventType?.FAULT, 250df226684Sopenharmony_ci params: { 251df226684Sopenharmony_ci 'CODE': code, 252df226684Sopenharmony_ci 'USER_ID': this.userId, 253df226684Sopenharmony_ci 'SANDBOX_PKGNAME': sandboxName, 254df226684Sopenharmony_ci } as Record<string, number | string> 255df226684Sopenharmony_ci }; 256df226684Sopenharmony_ci if (appIndex !== -1 && event.params) { 257df226684Sopenharmony_ci event.params['SANDBOX_INDEX'] = appIndex; 258df226684Sopenharmony_ci } 259df226684Sopenharmony_ci if (reason !== undefined && event.params) { 260df226684Sopenharmony_ci event.params['REASON'] = reason; 261df226684Sopenharmony_ci } 262df226684Sopenharmony_ci try { 263df226684Sopenharmony_ci await hiSysEvent.write(event); 264df226684Sopenharmony_ci } catch (err) { 265df226684Sopenharmony_ci HiLog.error(TAG, `sendDlpFileOpenFault failed`); 266df226684Sopenharmony_ci } 267df226684Sopenharmony_ci } 268df226684Sopenharmony_ci 269df226684Sopenharmony_ci async sendDlpFileOpenEvent(code: number, sandboxName: string, appIndex: number): Promise<void> { 270df226684Sopenharmony_ci let event: hiSysEvent.SysEventInfo = { 271df226684Sopenharmony_ci domain: 'DLP', 272df226684Sopenharmony_ci name: 'DLP_FILE_OPEN_EVENT', 273df226684Sopenharmony_ci eventType: hiSysEvent?.EventType?.BEHAVIOR, 274df226684Sopenharmony_ci params: { 275df226684Sopenharmony_ci 'CODE': code, 276df226684Sopenharmony_ci 'USER_ID': this.userId, 277df226684Sopenharmony_ci 'SANDBOX_PKGNAME': sandboxName, 278df226684Sopenharmony_ci } as Record<string, number | string> 279df226684Sopenharmony_ci }; 280df226684Sopenharmony_ci if (appIndex !== -1 && event.params) { 281df226684Sopenharmony_ci event.params['SANDBOX_INDEX'] = appIndex; 282df226684Sopenharmony_ci } 283df226684Sopenharmony_ci try { 284df226684Sopenharmony_ci await hiSysEvent.write(event); 285df226684Sopenharmony_ci } catch (err) { 286df226684Sopenharmony_ci HiLog.error(TAG, `sendDlpFileOpenEvent failed`); 287df226684Sopenharmony_ci } 288df226684Sopenharmony_ci } 289df226684Sopenharmony_ci 290df226684Sopenharmony_ci 291df226684Sopenharmony_ci async closeFile(): Promise<void> { 292df226684Sopenharmony_ci try { 293df226684Sopenharmony_ci await this.dlpFile.closeDLPFile(); 294df226684Sopenharmony_ci fileio.closeSync(this.dlpFd); 295df226684Sopenharmony_ci } catch (err) { 296df226684Sopenharmony_ci HiLog.error(TAG, `closeFile failed: ${JSON.stringify(err)}`); 297df226684Sopenharmony_ci } 298df226684Sopenharmony_ci } 299df226684Sopenharmony_ci 300df226684Sopenharmony_ci async startLoginAbility(): Promise<void> { 301df226684Sopenharmony_ci let accountWant: Want = { 302df226684Sopenharmony_ci bundleName: 'com.huawei.hmos.dlpcredmgr', 303df226684Sopenharmony_ci abilityName: 'DlpCredLoginAbility' 304df226684Sopenharmony_ci }; 305df226684Sopenharmony_ci try { 306df226684Sopenharmony_ci await checkNetworkStatus(); 307df226684Sopenharmony_ci } catch { 308df226684Sopenharmony_ci GetAlertMessage.requestModalUIExtension(this.context, { 309df226684Sopenharmony_ci code: Constants.ERR_JS_APP_NETWORK_INVALID } as BusinessError); 310df226684Sopenharmony_ci return; 311df226684Sopenharmony_ci }; 312df226684Sopenharmony_ci try { 313df226684Sopenharmony_ci await this.context.startAbility(accountWant); 314df226684Sopenharmony_ci } catch (err) { 315df226684Sopenharmony_ci HiLog.info(TAG, `Failed to invoke startAbility, ${JSON.stringify(err)}`) 316df226684Sopenharmony_ci return; 317df226684Sopenharmony_ci } 318df226684Sopenharmony_ci await this.terminateCall(); 319df226684Sopenharmony_ci } 320df226684Sopenharmony_ci 321df226684Sopenharmony_ci async getAccountAndOpenDLPFile(startId: number): Promise<void> { 322df226684Sopenharmony_ci hiTraceMeter.startTrace('DlpGetOsAccountJs', startId); 323df226684Sopenharmony_ci return new Promise(async (resolve, reject) => { 324df226684Sopenharmony_ci try { 325df226684Sopenharmony_ci this.accountInfo = await getOsAccountInfo(); 326df226684Sopenharmony_ci this.distributedInfoId = this.accountInfo.distributedInfo.id; 327df226684Sopenharmony_ci AppStorage.setOrCreate('accountDomain', this.accountInfo.domainInfo.domain); 328df226684Sopenharmony_ci this.userId = await getUserId(); 329df226684Sopenharmony_ci } catch (err) { 330df226684Sopenharmony_ci HiLog.error(TAG, `getOsAccountInfo failed: ${JSON.stringify(err)}`); 331df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpGetOsAccountJs', startId); 332df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpOpenFileJs', startId); 333df226684Sopenharmony_ci opening = false; 334df226684Sopenharmony_ci await GetAlertMessage.requestModalUIExtension(this.context, { 335df226684Sopenharmony_ci code: Constants.ERR_JS_GET_ACCOUNT_ERROR } as BusinessError); 336df226684Sopenharmony_ci fileio.closeSync(this.dlpFd); 337df226684Sopenharmony_ci reject(err); 338df226684Sopenharmony_ci return; 339df226684Sopenharmony_ci } 340df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpGetOsAccountJs', startId); 341df226684Sopenharmony_ci if (this.accountType === dlpPermission.AccountType.CLOUD_ACCOUNT) { 342df226684Sopenharmony_ci if (this.accountInfo.distributedInfo.name === 'ohosAnonymousName' && 343df226684Sopenharmony_ci this.accountInfo.distributedInfo.id === 'ohosAnonymousUid') { 344df226684Sopenharmony_ci HiLog.info(TAG, 'account not login'); 345df226684Sopenharmony_ci opening = false; 346df226684Sopenharmony_ci await this.startLoginAbility(); 347df226684Sopenharmony_ci reject(); 348df226684Sopenharmony_ci return; 349df226684Sopenharmony_ci } 350df226684Sopenharmony_ci resolve(); 351df226684Sopenharmony_ci return; 352df226684Sopenharmony_ci } 353df226684Sopenharmony_ci let codeMessage = checkDomainAccountInfo(this.accountInfo); 354df226684Sopenharmony_ci if (codeMessage) { 355df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpOpenFileJs', startId); 356df226684Sopenharmony_ci opening = false; 357df226684Sopenharmony_ci await GetAlertMessage.requestModalUIExtension(this.context, { 358df226684Sopenharmony_ci code: codeMessage } as BusinessError); 359df226684Sopenharmony_ci fileio.closeSync(this.dlpFd); 360df226684Sopenharmony_ci reject(); 361df226684Sopenharmony_ci return; 362df226684Sopenharmony_ci } 363df226684Sopenharmony_ci resolve(); 364df226684Sopenharmony_ci }); 365df226684Sopenharmony_ci } 366df226684Sopenharmony_ci 367df226684Sopenharmony_ci async callAlertAbility(errCode: BusinessError): Promise<void> { 368df226684Sopenharmony_ci await GetAlertMessage.requestModalUIExtension(this.context, errCode); 369df226684Sopenharmony_ci } 370df226684Sopenharmony_ci 371df226684Sopenharmony_ci async getOpenedDLPFile(startId: number): Promise<void> { 372df226684Sopenharmony_ci return new Promise(async (resolve, reject) => { 373df226684Sopenharmony_ci hiTraceMeter.startTrace('DlpOpenDlpFileJs', startId); 374df226684Sopenharmony_ci try { 375df226684Sopenharmony_ci HiLog.info(TAG, `openDLPFile: ${this.fileName}, dlpFd: ${this.dlpFd}`); 376df226684Sopenharmony_ci let callerAppId: string; 377df226684Sopenharmony_ci try { 378df226684Sopenharmony_ci callerAppId = await getAppId(this.callerBundleName); 379df226684Sopenharmony_ci HiLog.info(TAG, `get AppId success`); 380df226684Sopenharmony_ci } catch { 381df226684Sopenharmony_ci HiLog.error(TAG, `get AppId failed`); 382df226684Sopenharmony_ci await this.callAlertAbility({code: Constants.ERR_JS_NOT_AUTHORIZED_APPLICATION } as BusinessError); 383df226684Sopenharmony_ci return; 384df226684Sopenharmony_ci } 385df226684Sopenharmony_ci this.dlpFile = await dlpPermission.openDLPFile(this.dlpFd, callerAppId); 386df226684Sopenharmony_ci this.accountType = this.dlpFile.dlpProperty.ownerAccountType; 387df226684Sopenharmony_ci } catch (err) { 388df226684Sopenharmony_ci HiLog.error(TAG, `openDLPFile: ${decodeURIComponent(this.fileName)}, failed: ${JSON.stringify(err)}`); 389df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpOpenDlpFileJs', startId); 390df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpOpenFileJs', startId); 391df226684Sopenharmony_ci opening = false; 392df226684Sopenharmony_ci await this.sendDlpFileOpenFault( 393df226684Sopenharmony_ci Constants.DLP_FILE_PARSE_ERROR, this.sandboxBundleName, -1, (err as BusinessError<string>).data 394df226684Sopenharmony_ci ); // 103:DLP_FILE_PARSE_ERROR 395df226684Sopenharmony_ci let accountFlag: boolean = true; 396df226684Sopenharmony_ci if (this.accountType === dlpPermission.AccountType.DOMAIN_ACCOUNT && 397df226684Sopenharmony_ci err.code === Constants.ERR_JS_USER_NO_PERMISSION) { 398df226684Sopenharmony_ci let accountName: string = err.message.split(', contact:')?.[1]; 399df226684Sopenharmony_ci accountFlag = await GetAlertMessage.checkAccountInfo(accountName); 400df226684Sopenharmony_ci } 401df226684Sopenharmony_ci if (!accountFlag) { 402df226684Sopenharmony_ci await this.callAlertAbility({code: Constants.ERR_JS_APP_INSIDE_ERROR } as BusinessError); 403df226684Sopenharmony_ci return; 404df226684Sopenharmony_ci } 405df226684Sopenharmony_ci await this.callAlertAbility(err.code === Constants.ERR_JS_APP_PERMISSION_DENY ? 406df226684Sopenharmony_ci {code: Constants.ERR_JS_RELEASE_FILE_OPEN } as BusinessError : err); 407df226684Sopenharmony_ci fileio.closeSync(this.dlpFd); 408df226684Sopenharmony_ci reject(); 409df226684Sopenharmony_ci return; 410df226684Sopenharmony_ci } 411df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpOpenDlpFileJs', startId); 412df226684Sopenharmony_ci try { 413df226684Sopenharmony_ci await this.dlpGetAuthPerm(); 414df226684Sopenharmony_ci } catch (err) { 415df226684Sopenharmony_ci reject(); 416df226684Sopenharmony_ci return; 417df226684Sopenharmony_ci } 418df226684Sopenharmony_ci resolve(); 419df226684Sopenharmony_ci }) 420df226684Sopenharmony_ci } 421df226684Sopenharmony_ci 422df226684Sopenharmony_ci async dlpGetAuthPerm(): Promise<void> { 423df226684Sopenharmony_ci return new Promise(async (resolve, reject) => { 424df226684Sopenharmony_ci if (this.needCallAccount && this.accountType === dlpPermission.AccountType.DOMAIN_ACCOUNT) { 425df226684Sopenharmony_ci this.authPerm = getAuthPerm(this.accountInfo?.domainInfo.accountName ?? '', this.dlpFile.dlpProperty); 426df226684Sopenharmony_ci } else { 427df226684Sopenharmony_ci this.authPerm = dlpPermission.DLPFileAccess.READ_ONLY; 428df226684Sopenharmony_ci } 429df226684Sopenharmony_ci if (this.authPerm < dlpPermission.DLPFileAccess.READ_ONLY || 430df226684Sopenharmony_ci this.authPerm > dlpPermission.DLPFileAccess.FULL_CONTROL) { 431df226684Sopenharmony_ci opening = false; 432df226684Sopenharmony_ci await GetAlertMessage.requestModalUIExtension(this.context, { 433df226684Sopenharmony_ci code: Constants.ERR_JS_APP_INSIDE_ERROR } as BusinessError); 434df226684Sopenharmony_ci await this.closeFile(); 435df226684Sopenharmony_ci reject(); 436df226684Sopenharmony_ci return; 437df226684Sopenharmony_ci } 438df226684Sopenharmony_ci resolve(); 439df226684Sopenharmony_ci }); 440df226684Sopenharmony_ci } 441df226684Sopenharmony_ci 442df226684Sopenharmony_ci async getPolicyAndInstallSandbox(startId: number): Promise<void> { 443df226684Sopenharmony_ci return new Promise(async (resolve, reject) => { 444df226684Sopenharmony_ci this.alreadyOpened = false; 445df226684Sopenharmony_ci try { 446df226684Sopenharmony_ci await this.sandboxSetData(startId); 447df226684Sopenharmony_ci } catch { 448df226684Sopenharmony_ci reject(); 449df226684Sopenharmony_ci return; 450df226684Sopenharmony_ci } 451df226684Sopenharmony_ci AppStorage.setOrCreate('hiSandboxIndex', this.appIndex); 452df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpInstallSandboxJs', startId); 453df226684Sopenharmony_ci // 202: DLP_INSTALL_SANDBOX_SUCCESS 454df226684Sopenharmony_ci await this.sendDlpFileOpenEvent(Constants.DLP_INSTALL_SANDBOX_SUCCESS, this.sandboxBundleName, this.appIndex); 455df226684Sopenharmony_ci if (!this.alreadyOpened) { 456df226684Sopenharmony_ci try { 457df226684Sopenharmony_ci await this.getAlreadyOpen(startId); 458df226684Sopenharmony_ci } catch { 459df226684Sopenharmony_ci reject(); 460df226684Sopenharmony_ci return; 461df226684Sopenharmony_ci } 462df226684Sopenharmony_ci } 463df226684Sopenharmony_ci resolve(); 464df226684Sopenharmony_ci }); 465df226684Sopenharmony_ci } 466df226684Sopenharmony_ci 467df226684Sopenharmony_ci async sandboxSetData(startId: number): Promise<void> { 468df226684Sopenharmony_ci return new Promise(async (resolve, reject) => { 469df226684Sopenharmony_ci try { 470df226684Sopenharmony_ci let fileOpenHistory: Map<string, (number | string)[]> = 471df226684Sopenharmony_ci GlobalContext.load('fileOpenHistory') as Map<string, (number | string)[]>; 472df226684Sopenharmony_ci if (fileOpenHistory.has(this.uri) && this.historyOpenSame(fileOpenHistory)) { 473df226684Sopenharmony_ci HiLog.info(TAG, `file: ${this.fileName} already open`); 474df226684Sopenharmony_ci let value: (number | string)[] = fileOpenHistory.get(this.uri) as (number | string)[]; 475df226684Sopenharmony_ci this.appIndex = value[Constants.FILE_OPEN_HISTORY_ONE] as number; 476df226684Sopenharmony_ci this.linkFileName = value[Constants.FILE_OPEN_HISTORY_TWO] as string; 477df226684Sopenharmony_ci this.linkUri = value[Constants.FILE_OPEN_HISTORY_THREE] as string; 478df226684Sopenharmony_ci fs.closeSync(this.dlpFd); 479df226684Sopenharmony_ci let dlpFileInfo = 480df226684Sopenharmony_ci await getDlpFileInfoFromSandbox2linkFileData(this.sandboxBundleName + this.appIndex, this.uri); 481df226684Sopenharmony_ci this.dlpFile = dlpFileInfo.dlpFile; 482df226684Sopenharmony_ci this.tokenId = dlpFileInfo.tokenId; 483df226684Sopenharmony_ci this.accountType = this.dlpFile.dlpProperty.ownerAccountType; 484df226684Sopenharmony_ci await this.dlpGetAuthPerm(); 485df226684Sopenharmony_ci this.alreadyOpened = true; 486df226684Sopenharmony_ci } else { 487df226684Sopenharmony_ci await this.getOpenedDLPFile(startId); 488df226684Sopenharmony_ci } 489df226684Sopenharmony_ci hiTraceMeter.startTrace('DlpInstallSandboxJs', startId); 490df226684Sopenharmony_ci let appInfo: dlpPermission.DLPSandboxInfo = await dlpPermission.installDLPSandbox( 491df226684Sopenharmony_ci this.sandboxBundleName, this.authPerm, this.userId, this.uri 492df226684Sopenharmony_ci ); 493df226684Sopenharmony_ci if (this.alreadyOpened && (this.appIndex != appInfo.appIndex || this.tokenId != appInfo.tokenID)) { 494df226684Sopenharmony_ci HiLog.info(TAG, `return:${this.appIndex} ${appInfo.appIndex} ${this.tokenId} ${appInfo.tokenID} `); 495df226684Sopenharmony_ci await this.deleteData(false, true); 496df226684Sopenharmony_ci this.dlpFd = getFileFd(this.uri, fs.OpenMode.READ_WRITE); 497df226684Sopenharmony_ci await this.getOpenedDLPFile(startId); 498df226684Sopenharmony_ci this.alreadyOpened = false; 499df226684Sopenharmony_ci } 500df226684Sopenharmony_ci this.appIndex = appInfo.appIndex; 501df226684Sopenharmony_ci this.tokenId = appInfo.tokenID; 502df226684Sopenharmony_ci resolve(); 503df226684Sopenharmony_ci } catch (err) { 504df226684Sopenharmony_ci HiLog.error(TAG, `installDLPSandbox failed: ${JSON.stringify(err)}`); 505df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpInstallSandboxJs', startId); 506df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpOpenFileJs', startId); 507df226684Sopenharmony_ci opening = false; 508df226684Sopenharmony_ci await this.sendDlpFileOpenFault( 509df226684Sopenharmony_ci Constants.DLP_INSTALL_SANDBOX_ERROR, this.sandboxBundleName, -1, (err as BusinessError<string>).data 510df226684Sopenharmony_ci ); // 104:DLP_INSTALL_SANDBOX_ERROR 511df226684Sopenharmony_ci await GetAlertMessage.requestModalUIExtension(this.context, { 512df226684Sopenharmony_ci code: Constants.ERR_JS_APP_INSIDE_ERROR } as BusinessError); 513df226684Sopenharmony_ci await this.closeFile(); 514df226684Sopenharmony_ci reject(); 515df226684Sopenharmony_ci } 516df226684Sopenharmony_ci }) 517df226684Sopenharmony_ci } 518df226684Sopenharmony_ci 519df226684Sopenharmony_ci historyOpenSame(fileOpenHistory: Map<string, (number | string)[]>): boolean { 520df226684Sopenharmony_ci let historyDistributedInfoId = fileOpenHistory.get(this.uri); 521df226684Sopenharmony_ci let distributeId = historyDistributedInfoId ? historyDistributedInfoId[4] : ''; 522df226684Sopenharmony_ci if (distributeId === this.distributedInfoId) { 523df226684Sopenharmony_ci return true; 524df226684Sopenharmony_ci }; 525df226684Sopenharmony_ci return false; 526df226684Sopenharmony_ci } 527df226684Sopenharmony_ci 528df226684Sopenharmony_ci async generateLinkFileName(startId: number): Promise<string> { 529df226684Sopenharmony_ci return new Promise<string>(async (resolve, reject) => { 530df226684Sopenharmony_ci let timestamp = new Date().getTime(); 531df226684Sopenharmony_ci let splitNames = this.fileName.split('.'); 532df226684Sopenharmony_ci HiLog.debug(TAG, `splitNames: ${splitNames}`); 533df226684Sopenharmony_ci if (splitNames.length <= SUFFIX_INDEX) { 534df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpOpenFileJs', startId); 535df226684Sopenharmony_ci opening = false; 536df226684Sopenharmony_ci await GetAlertMessage.requestModalUIExtension(this.context, { 537df226684Sopenharmony_ci code: Constants.ERR_JS_APP_INSIDE_ERROR } as BusinessError); 538df226684Sopenharmony_ci await this.closeFile(); 539df226684Sopenharmony_ci reject(''); 540df226684Sopenharmony_ci return; 541df226684Sopenharmony_ci } 542df226684Sopenharmony_ci let secondarySuffix = splitNames[splitNames.length - SUFFIX_INDEX]; 543df226684Sopenharmony_ci this.linkFileName = String(this.sandboxBundleName).substring(0, Constants.BUNDLE_LEN) + '_' + this.appIndex + 544df226684Sopenharmony_ci '_' + timestamp + String(Math.random()).substring(Constants.RAND_START, Constants.RAND_END) + '.dlp.link.' + 545df226684Sopenharmony_ci secondarySuffix; 546df226684Sopenharmony_ci resolve(secondarySuffix); 547df226684Sopenharmony_ci }); 548df226684Sopenharmony_ci } 549df226684Sopenharmony_ci 550df226684Sopenharmony_ci async getAlreadyOpen(startId: number): Promise<void> { 551df226684Sopenharmony_ci return new Promise(async (resolve, reject) => { 552df226684Sopenharmony_ci try { 553df226684Sopenharmony_ci await this.generateLinkFileName(startId); 554df226684Sopenharmony_ci } catch { 555df226684Sopenharmony_ci reject(); 556df226684Sopenharmony_ci return; 557df226684Sopenharmony_ci } 558df226684Sopenharmony_ci hiTraceMeter.startTrace('DlpAddLinkFileJs', startId); 559df226684Sopenharmony_ci try { 560df226684Sopenharmony_ci await this.getAddDLPLinkFile(startId); 561df226684Sopenharmony_ci } catch { 562df226684Sopenharmony_ci reject(); 563df226684Sopenharmony_ci return; 564df226684Sopenharmony_ci } 565df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpAddLinkFileJs', startId); 566df226684Sopenharmony_ci try { 567df226684Sopenharmony_ci this.linkFilePath = Constants.FUSE_PATH + this.linkFileName; 568df226684Sopenharmony_ci let stat = fs.statSync(this.linkFilePath); 569df226684Sopenharmony_ci const WRITE_ACCESS: number = 0o0200; 570df226684Sopenharmony_ci if (stat.mode & WRITE_ACCESS) { 571df226684Sopenharmony_ci this.linkFileWriteable = true; 572df226684Sopenharmony_ci } else { 573df226684Sopenharmony_ci this.linkFileWriteable = false; 574df226684Sopenharmony_ci } 575df226684Sopenharmony_ci } catch (err) { 576df226684Sopenharmony_ci HiLog.error(TAG, `file error: ${JSON.stringify(err)}`); 577df226684Sopenharmony_ci opening = false; 578df226684Sopenharmony_ci try { 579df226684Sopenharmony_ci await this.terminateCall(); 580df226684Sopenharmony_ci } catch (err) { 581df226684Sopenharmony_ci reject(); 582df226684Sopenharmony_ci return; 583df226684Sopenharmony_ci } 584df226684Sopenharmony_ci } 585df226684Sopenharmony_ci this.linkUri = getFileUriByPath(this.linkFilePath); 586df226684Sopenharmony_ci if (this.linkUri === '') { 587df226684Sopenharmony_ci HiLog.error(TAG, `get linkUri ByPath fail`); 588df226684Sopenharmony_ci opening = false; 589df226684Sopenharmony_ci try { 590df226684Sopenharmony_ci await this.terminateCall(); 591df226684Sopenharmony_ci } catch (err) { 592df226684Sopenharmony_ci reject(); 593df226684Sopenharmony_ci return; 594df226684Sopenharmony_ci } 595df226684Sopenharmony_ci } 596df226684Sopenharmony_ci resolve(); 597df226684Sopenharmony_ci }); 598df226684Sopenharmony_ci } 599df226684Sopenharmony_ci 600df226684Sopenharmony_ci async getAddDLPLinkFile(startId: number): Promise<void> { 601df226684Sopenharmony_ci return new Promise(async (resolve, reject) => { 602df226684Sopenharmony_ci try { 603df226684Sopenharmony_ci await this.dlpFile.addDLPLinkFile(this.linkFileName); 604df226684Sopenharmony_ci } catch (error) { 605df226684Sopenharmony_ci HiLog.error(TAG, `addDLPLinkFile failed: ${JSON.stringify(error)}`); 606df226684Sopenharmony_ci try { 607df226684Sopenharmony_ci await this.dlpFile.closeDLPFile(); 608df226684Sopenharmony_ci } catch (err) { 609df226684Sopenharmony_ci HiLog.error(TAG, `closeDLPFile failed: ${JSON.stringify(err)}`); 610df226684Sopenharmony_ci } 611df226684Sopenharmony_ci opening = false; 612df226684Sopenharmony_ci await GetAlertMessage.requestModalUIExtension(this.context, error); 613df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpAddLinkFileJs', startId); 614df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpOpenFileJs', startId); 615df226684Sopenharmony_ci await this.closeFile(); 616df226684Sopenharmony_ci reject(); 617df226684Sopenharmony_ci return; 618df226684Sopenharmony_ci } 619df226684Sopenharmony_ci resolve(); 620df226684Sopenharmony_ci }); 621df226684Sopenharmony_ci } 622df226684Sopenharmony_ci 623df226684Sopenharmony_ci async getUriInfo(startId: number): Promise<void> { 624df226684Sopenharmony_ci return new Promise(async (resolve, reject) => { 625df226684Sopenharmony_ci try { 626df226684Sopenharmony_ci this.uriInfo = new fileUri.FileUri(this.uri); 627df226684Sopenharmony_ci } catch (error) { 628df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpOpenFileJs', startId); 629df226684Sopenharmony_ci opening = false; 630df226684Sopenharmony_ci await GetAlertMessage.requestModalUIExtension(this.context, { 631df226684Sopenharmony_ci code: Constants.ERR_JS_APP_GET_FILE_ASSET_ERROR } as BusinessError); 632df226684Sopenharmony_ci await this.closeFile(); 633df226684Sopenharmony_ci HiLog.error(TAG, `open: ${this.uri}, failed: ${JSON.stringify(error)}`); 634df226684Sopenharmony_ci reject(); 635df226684Sopenharmony_ci return; 636df226684Sopenharmony_ci } 637df226684Sopenharmony_ci try { 638df226684Sopenharmony_ci this.stat = await fs.stat(this.uriInfo.path); 639df226684Sopenharmony_ci AppStorage.setOrCreate('hiFileSize', this.stat.size); 640df226684Sopenharmony_ci AppStorage.setOrCreate('hiPolicySizeEnc', this.stat.size); 641df226684Sopenharmony_ci } catch (err) { 642df226684Sopenharmony_ci HiLog.info(TAG, `stat fail: ${JSON.stringify(err)}`); 643df226684Sopenharmony_ci } 644df226684Sopenharmony_ci resolve(); 645df226684Sopenharmony_ci }); 646df226684Sopenharmony_ci } 647df226684Sopenharmony_ci 648df226684Sopenharmony_ci onConnect(want: Want): rpc.RemoteObject { 649df226684Sopenharmony_ci return new rpc.RemoteObject(TAG); 650df226684Sopenharmony_ci } 651df226684Sopenharmony_ci 652df226684Sopenharmony_ci onDisconnect(want: Want): void { 653df226684Sopenharmony_ci HiLog.info(TAG, `onDisconnect`); 654df226684Sopenharmony_ci } 655df226684Sopenharmony_ci 656df226684Sopenharmony_ci dlpFileMapHistory(want: Want): Promise<void> { 657df226684Sopenharmony_ci return new Promise(async (resolve, reject) => { 658df226684Sopenharmony_ci this.callerBundleName = want.parameters?.['ohos.dlp.params.bundleName'] as string; 659df226684Sopenharmony_ci AppStorage.setOrCreate('hiSandboxPkgName', this.callerBundleName); 660df226684Sopenharmony_ci if ((AppStorage.get('dlpFileMap') as Map<string, (string | number)[]>)?.has(want.uri ?? '')) { 661df226684Sopenharmony_ci await GetAlertMessage.requestModalUIExtension(this.context, { 662df226684Sopenharmony_ci code: Constants.ERR_JS_APP_ENCRYPTION_REJECTED } as BusinessError); 663df226684Sopenharmony_ci reject(); 664df226684Sopenharmony_ci return; 665df226684Sopenharmony_ci } 666df226684Sopenharmony_ci this.uri = want.uri as string; 667df226684Sopenharmony_ci if (opening) { 668df226684Sopenharmony_ci HiLog.info(TAG, `file is opening: ${this.uri}`); 669df226684Sopenharmony_ci reject(); 670df226684Sopenharmony_ci return; 671df226684Sopenharmony_ci } else { 672df226684Sopenharmony_ci opening = true; 673df226684Sopenharmony_ci HiLog.info(TAG, `file is opened: ${this.uri}`); 674df226684Sopenharmony_ci } 675df226684Sopenharmony_ci if (!isValidPath(this.uri)) { 676df226684Sopenharmony_ci opening = false; 677df226684Sopenharmony_ci HiLog.error(TAG, `invalid uri in want.uri`); 678df226684Sopenharmony_ci try { 679df226684Sopenharmony_ci await this.terminateCall(); 680df226684Sopenharmony_ci } catch (err) { 681df226684Sopenharmony_ci reject(); 682df226684Sopenharmony_ci return; 683df226684Sopenharmony_ci } 684df226684Sopenharmony_ci } 685df226684Sopenharmony_ci let strArray: string[] = this.uri.split('/'); 686df226684Sopenharmony_ci let len: number = strArray.length; 687df226684Sopenharmony_ci this.fileName = strArray[len - 1]; 688df226684Sopenharmony_ci this.dlpFd = getFileFd(this.uri, fs.OpenMode.READ_WRITE); 689df226684Sopenharmony_ci HiLog.debug(TAG, `dlpFd: ${this.dlpFd}`); 690df226684Sopenharmony_ci if (this.dlpFd === -1) { 691df226684Sopenharmony_ci opening = false; 692df226684Sopenharmony_ci try { 693df226684Sopenharmony_ci await this.terminateCall(); 694df226684Sopenharmony_ci } catch (err) { 695df226684Sopenharmony_ci reject(); 696df226684Sopenharmony_ci return; 697df226684Sopenharmony_ci } 698df226684Sopenharmony_ci } 699df226684Sopenharmony_ci resolve(); 700df226684Sopenharmony_ci }) 701df226684Sopenharmony_ci } 702df226684Sopenharmony_ci 703df226684Sopenharmony_ci async checkNeedCallAccount(): Promise<boolean> { 704df226684Sopenharmony_ci switch (this.accountType) { 705df226684Sopenharmony_ci case dlpPermission.AccountType.CLOUD_ACCOUNT: { 706df226684Sopenharmony_ci return true; 707df226684Sopenharmony_ci } 708df226684Sopenharmony_ci case dlpPermission.AccountType.DOMAIN_ACCOUNT: { 709df226684Sopenharmony_ci try { 710df226684Sopenharmony_ci this.accountInfo = await getOsAccountInfo(); 711df226684Sopenharmony_ci this.userId = await getUserId(); 712df226684Sopenharmony_ci } catch (err) { 713df226684Sopenharmony_ci HiLog.error(TAG, 'getOsAccountInfo failed: ${JSON.stringify(err)}'); 714df226684Sopenharmony_ci return true; 715df226684Sopenharmony_ci } 716df226684Sopenharmony_ci if (this.accountInfo.domainInfo.accountName === '') { 717df226684Sopenharmony_ci HiLog.debug(TAG, 'not need check call account'); 718df226684Sopenharmony_ci return false; 719df226684Sopenharmony_ci } 720df226684Sopenharmony_ci } 721df226684Sopenharmony_ci defalut: { 722df226684Sopenharmony_ci break; 723df226684Sopenharmony_ci } 724df226684Sopenharmony_ci } 725df226684Sopenharmony_ci return true; 726df226684Sopenharmony_ci } 727df226684Sopenharmony_ci 728df226684Sopenharmony_ci grandUriPermission() { 729df226684Sopenharmony_ci let flag = wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | 730df226684Sopenharmony_ci wantConstant.Flags.FLAG_AUTH_PERSISTABLE_URI_PERMISSION; 731df226684Sopenharmony_ci let targetBundleName = this.sandboxBundleName; 732df226684Sopenharmony_ci uriPermissionManager.grantUriPermission(this.uri, flag, targetBundleName, (result) => { 733df226684Sopenharmony_ci HiLog.info(TAG, `grandUriPermission result: ${JSON.stringify(result)}`); 734df226684Sopenharmony_ci }); 735df226684Sopenharmony_ci } 736df226684Sopenharmony_ci 737df226684Sopenharmony_ci async onRequest(want: Want, startId: number): Promise<void> { 738df226684Sopenharmony_ci HiLog.debug(TAG, `enter onRequest`); 739df226684Sopenharmony_ci let paramCallerBundleName = want.parameters?.['ohos.aafwk.param.callerBundleName'] as string; 740df226684Sopenharmony_ci AppStorage.setOrCreate('paramCallerBundleName', paramCallerBundleName); 741df226684Sopenharmony_ci 742df226684Sopenharmony_ci let pluginId: string = (want.parameters?.['DlpConnectionPluginId'] as DlpConnectionPluginIdObj)?.id; 743df226684Sopenharmony_ci 744df226684Sopenharmony_ci if (pluginId !== null && pluginId !== undefined && paramCallerBundleName !== 'com.huawei.it.welink') { 745df226684Sopenharmony_ci HiLog.debug(TAG, 'call bundle name is: ${JSON.stringify(paramCallerBundleName)}'); 746df226684Sopenharmony_ci return; 747df226684Sopenharmony_ci } 748df226684Sopenharmony_ci try { 749df226684Sopenharmony_ci await this.dlpFileMapHistory(want); 750df226684Sopenharmony_ci this.accountType = await getAccountType(this.context, this.dlpFd); 751df226684Sopenharmony_ci } catch { 752df226684Sopenharmony_ci return; 753df226684Sopenharmony_ci } 754df226684Sopenharmony_ci startId = Number(startId); 755df226684Sopenharmony_ci hiTraceMeter.startTrace('DlpOpenFileJs', startId); 756df226684Sopenharmony_ci this.sandboxBundleName = want.parameters?.['ohos.dlp.params.bundleName'] as string; 757df226684Sopenharmony_ci this.sandboxAbilityName = want.parameters?.['ohos.dlp.params.abilityName'] as string; 758df226684Sopenharmony_ci this.sandboxModuleName = want.parameters?.['ohos.dlp.params.moduleName'] as string; 759df226684Sopenharmony_ci this.needCallAccount = await this.checkNeedCallAccount(); 760df226684Sopenharmony_ci if (this.fileName === undefined || this.dlpFd === undefined || this.uri === undefined || 761df226684Sopenharmony_ci this.sandboxBundleName === undefined || this.sandboxAbilityName === undefined || 762df226684Sopenharmony_ci this.sandboxModuleName === undefined || !this.uri.endsWith('.dlp')) { 763df226684Sopenharmony_ci opening = false; 764df226684Sopenharmony_ci HiLog.error(TAG, `get parameters failed`); 765df226684Sopenharmony_ci try { 766df226684Sopenharmony_ci await this.terminateCall(); 767df226684Sopenharmony_ci } catch (err) { 768df226684Sopenharmony_ci return; 769df226684Sopenharmony_ci } 770df226684Sopenharmony_ci } 771df226684Sopenharmony_ci let fileOpenHistory: Map<string, (number | string)[]> = 772df226684Sopenharmony_ci GlobalContext.load('fileOpenHistory') as Map<string, (number | string)[]>; 773df226684Sopenharmony_ci if (fileOpenHistory.has(this.uri)) { 774df226684Sopenharmony_ci let value: (number | string)[] = fileOpenHistory.get(this.uri) as (number | string)[]; 775df226684Sopenharmony_ci if (this.sandboxBundleName !== value[Constants.FILE_OPEN_HISTORY_ZERO] as string) { 776df226684Sopenharmony_ci HiLog.error(TAG, `other app is opening this file`); 777df226684Sopenharmony_ci opening = false; 778df226684Sopenharmony_ci await GetAlertMessage.requestModalUIExtension(this.context, { 779df226684Sopenharmony_ci code: Constants.ERR_JS_OTHER_APP_OPEN_FILE } as BusinessError); 780df226684Sopenharmony_ci return; 781df226684Sopenharmony_ci } 782df226684Sopenharmony_ci } 783df226684Sopenharmony_ci try { 784df226684Sopenharmony_ci if (this.needCallAccount) { 785df226684Sopenharmony_ci await this.getAccountAndOpenDLPFile(startId); 786df226684Sopenharmony_ci } 787df226684Sopenharmony_ci await this.getPolicyAndInstallSandbox(startId); 788df226684Sopenharmony_ci await this.getUriInfo(startId); 789df226684Sopenharmony_ci } catch { 790df226684Sopenharmony_ci return; 791df226684Sopenharmony_ci } 792df226684Sopenharmony_ci this.grandUriPermission(); 793df226684Sopenharmony_ci this.startSandboxApp(startId, want); 794df226684Sopenharmony_ci AppStorage.setOrCreate('hiCode', Constants.DLP_START_SANDBOX_SUCCESS); 795df226684Sopenharmony_ci sendDlpFileOpenProperties(); 796df226684Sopenharmony_ci hiTraceMeter.finishTrace('DlpOpenFileJs', startId); 797df226684Sopenharmony_ci } 798df226684Sopenharmony_ci} 799