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