1df226684Sopenharmony_ci/*
2df226684Sopenharmony_ci * Copyright (c) 2023 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 measure from '@ohos.measure';
17df226684Sopenharmony_ciimport window from '@ohos.window';
18df226684Sopenharmony_ciimport ability from '@ohos.ability.ability';
19df226684Sopenharmony_ciimport account_osAccount from '@ohos.account.osAccount';
20df226684Sopenharmony_ciimport emitter from '@ohos.events.emitter';
21df226684Sopenharmony_ciimport dlpPermission from '@ohos.dlpPermission';
22df226684Sopenharmony_ciimport bundleManager from '@ohos.bundle.bundleManager';
23df226684Sopenharmony_ciimport fs from '@ohos.file.fs';
24df226684Sopenharmony_ciimport zlib from '@ohos.zlib';
25df226684Sopenharmony_ciimport util from '@ohos.util';
26df226684Sopenharmony_ciimport fileUri from '@ohos.file.fileuri';
27df226684Sopenharmony_ciimport { BusinessError, Callback } from '@ohos.base'
28df226684Sopenharmony_ciimport Want from '@ohos.app.ability.Want';
29df226684Sopenharmony_ciimport common from '@ohos.app.ability.common';
30df226684Sopenharmony_ciimport connection from '@ohos.net.connection';
31df226684Sopenharmony_ciimport UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession';
32df226684Sopenharmony_ciimport Constants from '../common/constant';
33df226684Sopenharmony_ciimport GlobalContext from './GlobalContext';
34df226684Sopenharmony_ciimport hiSysEvent from '@ohos.hiSysEvent';
35df226684Sopenharmony_ciimport { HiLog } from '../common/HiLog';
36df226684Sopenharmony_ci
37df226684Sopenharmony_ciconst TAG = 'Utils';
38df226684Sopenharmony_ciconst HEAD_LENGTH_IN_BYTE = 28;
39df226684Sopenharmony_ciconst HEAD_LENGTH_IN_U32 = 7;
40df226684Sopenharmony_ciconst CERT_OFFSET = 5;
41df226684Sopenharmony_ciconst CERT_SIZE = 6;
42df226684Sopenharmony_ciclass ChangeOption {
43df226684Sopenharmony_ci  public offset: number = 0
44df226684Sopenharmony_ci  public length: number = 0
45df226684Sopenharmony_ci}
46df226684Sopenharmony_cilet defaultDlpProperty: dlpPermission.DLPProperty = {
47df226684Sopenharmony_ci  ownerAccount: '',
48df226684Sopenharmony_ci  ownerAccountType: dlpPermission.AccountType.DOMAIN_ACCOUNT,
49df226684Sopenharmony_ci  authUserList: [],
50df226684Sopenharmony_ci  contactAccount: '',
51df226684Sopenharmony_ci  offlineAccess: true,
52df226684Sopenharmony_ci  ownerAccountID: '',
53df226684Sopenharmony_ci  everyoneAccessList: []
54df226684Sopenharmony_ci}
55df226684Sopenharmony_ci
56df226684Sopenharmony_cilet defaultDlpFile: dlpPermission.DLPFile = {
57df226684Sopenharmony_ci  dlpProperty: defaultDlpProperty,
58df226684Sopenharmony_ci  recoverDLPFile: async () => {},
59df226684Sopenharmony_ci  closeDLPFile: async () => {},
60df226684Sopenharmony_ci  addDLPLinkFile: async () => {},
61df226684Sopenharmony_ci  stopFuseLink: async () => {},
62df226684Sopenharmony_ci  resumeFuseLink: async () => {},
63df226684Sopenharmony_ci  replaceDLPLinkFile: async () => {},
64df226684Sopenharmony_ci  deleteDLPLinkFile: async () => {}
65df226684Sopenharmony_ci};
66df226684Sopenharmony_ci
67df226684Sopenharmony_ciinterface AuthAccount {
68df226684Sopenharmony_ci  authAccount: string;
69df226684Sopenharmony_ci  textContent?: string;
70df226684Sopenharmony_ci}
71df226684Sopenharmony_ci
72df226684Sopenharmony_ciinterface PermissionType {
73df226684Sopenharmony_ci  value: Resource;
74df226684Sopenharmony_ci  data: string;
75df226684Sopenharmony_ci  index: number;
76df226684Sopenharmony_ci}
77df226684Sopenharmony_ci
78df226684Sopenharmony_ciinterface DLPInfo {
79df226684Sopenharmony_ci  name: string;
80df226684Sopenharmony_ci  versionCode: string;
81df226684Sopenharmony_ci}
82df226684Sopenharmony_ci
83df226684Sopenharmony_cifunction getFileUriByPath(filePath: string): string {
84df226684Sopenharmony_ci  try {
85df226684Sopenharmony_ci    let uri = fileUri.getUriFromPath(filePath);
86df226684Sopenharmony_ci    return uri;
87df226684Sopenharmony_ci  } catch (err) {
88df226684Sopenharmony_ci    HiLog.info(TAG, `getUriFromPath error: ${JSON.stringify(err)}`);
89df226684Sopenharmony_ci    return '';
90df226684Sopenharmony_ci  }
91df226684Sopenharmony_ci}
92df226684Sopenharmony_ci
93df226684Sopenharmony_cifunction getFileFd(uri: string, mode?: number): number {
94df226684Sopenharmony_ci  mode = mode || fs.OpenMode.READ_ONLY;
95df226684Sopenharmony_ci  try {
96df226684Sopenharmony_ci    let file = fs.openSync(uri, mode);
97df226684Sopenharmony_ci    HiLog.info(TAG, `open: ${uri}, as: ${file.fd}`);
98df226684Sopenharmony_ci    return file.fd;
99df226684Sopenharmony_ci  } catch (err) {
100df226684Sopenharmony_ci    HiLog.info(TAG, `openSync error: ${JSON.stringify(err)}`);
101df226684Sopenharmony_ci    return -1;
102df226684Sopenharmony_ci  }
103df226684Sopenharmony_ci}
104df226684Sopenharmony_ci
105df226684Sopenharmony_ciasync function getOsAccountInfo(): Promise<account_osAccount.OsAccountInfo> {
106df226684Sopenharmony_ci  let accountMgr = account_osAccount.getAccountManager();
107df226684Sopenharmony_ci  return await accountMgr.queryOsAccount();
108df226684Sopenharmony_ci}
109df226684Sopenharmony_ci
110df226684Sopenharmony_cifunction checkDomainAccountInfo(accountInfo: account_osAccount.OsAccountInfo): number {
111df226684Sopenharmony_ci  AppStorage.setOrCreate('hiAccountType', dlpPermission.AccountType.DOMAIN_ACCOUNT);
112df226684Sopenharmony_ci  if (accountInfo.domainInfo.accountName === '' &&
113df226684Sopenharmony_ci    accountInfo.domainInfo.accountId === '') {
114df226684Sopenharmony_ci    AppStorage.setOrCreate('hiAccountStatus', 0);
115df226684Sopenharmony_ci    return Constants.ERR_JS_APP_NO_ACCOUNT_ERROR;
116df226684Sopenharmony_ci  }
117df226684Sopenharmony_ci  if (!accountInfo.domainInfo.isAuthenticated) {
118df226684Sopenharmony_ci    AppStorage.setOrCreate('hiAccountStatus', 0);
119df226684Sopenharmony_ci    return Constants.ERR_JS_APP_SYSTEM_IS_AUTHENTICATED;
120df226684Sopenharmony_ci  }
121df226684Sopenharmony_ci  AppStorage.setOrCreate('hiAccountStatus', 1);
122df226684Sopenharmony_ci  return Constants.ERR_JS_APP_ACCOUNT_INFO;
123df226684Sopenharmony_ci}
124df226684Sopenharmony_ci
125df226684Sopenharmony_ciasync function getUserId(): Promise<number> {
126df226684Sopenharmony_ci  let accountMgr = account_osAccount.getAccountManager();
127df226684Sopenharmony_ci  return await accountMgr.getOsAccountLocalId();
128df226684Sopenharmony_ci}
129df226684Sopenharmony_ci
130df226684Sopenharmony_cifunction getAuthPerm(accountName: string, dlpProperty: dlpPermission.DLPProperty): dlpPermission.DLPFileAccess {
131df226684Sopenharmony_ci  let perm: dlpPermission.DLPFileAccess = dlpPermission.DLPFileAccess.NO_PERMISSION;
132df226684Sopenharmony_ci  if (accountName === dlpProperty.ownerAccount) {
133df226684Sopenharmony_ci    return dlpPermission.DLPFileAccess.FULL_CONTROL;
134df226684Sopenharmony_ci  }
135df226684Sopenharmony_ci  if ((dlpProperty.everyoneAccessList !== undefined) && (dlpProperty.everyoneAccessList.length > 0)) {
136df226684Sopenharmony_ci    perm = Math.max(...dlpProperty.everyoneAccessList);
137df226684Sopenharmony_ci  }
138df226684Sopenharmony_ci  let authUserList = dlpProperty.authUserList ?? [];
139df226684Sopenharmony_ci  for (let i = 0; i < authUserList.length; ++i) {
140df226684Sopenharmony_ci    let authUser = authUserList[i];
141df226684Sopenharmony_ci    if (authUser.authAccount === accountName) {
142df226684Sopenharmony_ci      return authUser.dlpFileAccess;
143df226684Sopenharmony_ci    }
144df226684Sopenharmony_ci  }
145df226684Sopenharmony_ci  return perm;
146df226684Sopenharmony_ci}
147df226684Sopenharmony_ci
148df226684Sopenharmony_cifunction terminateSelfWithResult(resultCode: number, result: string): void {
149df226684Sopenharmony_ci  let abilityResult: ability.AbilityResult = {
150df226684Sopenharmony_ci    resultCode: resultCode,
151df226684Sopenharmony_ci    want: {
152df226684Sopenharmony_ci      parameters: {
153df226684Sopenharmony_ci        result: result
154df226684Sopenharmony_ci      }
155df226684Sopenharmony_ci    }
156df226684Sopenharmony_ci  };
157df226684Sopenharmony_ci  (getContext() as common.UIAbilityContext).terminateSelfWithResult(abilityResult);
158df226684Sopenharmony_ci}
159df226684Sopenharmony_ci
160df226684Sopenharmony_cifunction judgeIsSandBox(want: Want) {
161df226684Sopenharmony_ci  return new Promise<boolean>(async resolve => {
162df226684Sopenharmony_ci    let callerToken: number = want.parameters?.['ohos.aafwk.param.callerToken'] as number;
163df226684Sopenharmony_ci    let callerBundleName: string = want.parameters?.['ohos.aafwk.param.callerBundleName'] as string;
164df226684Sopenharmony_ci    let applicationInfo = await bundleManager.getApplicationInfo(
165df226684Sopenharmony_ci      callerBundleName, bundleManager.ApplicationFlag.GET_APPLICATION_INFO_DEFAULT);
166df226684Sopenharmony_ci    if (callerToken === applicationInfo.accessTokenId) {
167df226684Sopenharmony_ci      resolve(false);
168df226684Sopenharmony_ci    }
169df226684Sopenharmony_ci    resolve(true);
170df226684Sopenharmony_ci  })
171df226684Sopenharmony_ci}
172df226684Sopenharmony_ci
173df226684Sopenharmony_cilet removeDuplicate = (arr: AuthAccount[], arg: string) => {
174df226684Sopenharmony_ci  let map: Map<string, AuthAccount> = new Map();
175df226684Sopenharmony_ci  for (let item of arr) {
176df226684Sopenharmony_ci    if (!map.has(item.authAccount)) {
177df226684Sopenharmony_ci      map.set(item.authAccount, item);
178df226684Sopenharmony_ci    }
179df226684Sopenharmony_ci  }
180df226684Sopenharmony_ci  return Array.from<AuthAccount>(map.values());
181df226684Sopenharmony_ci}
182df226684Sopenharmony_ci
183df226684Sopenharmony_ci
184df226684Sopenharmony_cilet calculate = (newValue: Area, allNames: AuthAccount[]) => {
185df226684Sopenharmony_ci  let editLength = allNames.length;
186df226684Sopenharmony_ci  let screenWidth = Number(newValue['width']);
187df226684Sopenharmony_ci  let nameChange = Constants.ENCRYPTION_STAFF_WIDTH_NAME;
188df226684Sopenharmony_ci  let rowNamesLen = Math.floor(screenWidth / (nameChange + Constants.ENCRYPTION_ADD_STAFF_MARGIN_RIGHT));
189df226684Sopenharmony_ci  let showNamesArr = editLength > Constants.ENCRYPTION_DOUBLED_NUMBER * rowNamesLen
190df226684Sopenharmony_ci    ? allNames.slice(0, 2 * rowNamesLen - 1)
191df226684Sopenharmony_ci    : allNames.slice(0, 2 * rowNamesLen);
192df226684Sopenharmony_ci  let hideNamesNum = editLength - showNamesArr.length > 0
193df226684Sopenharmony_ci    ? String(editLength - showNamesArr.length)
194df226684Sopenharmony_ci    : '0';
195df226684Sopenharmony_ci  return {
196df226684Sopenharmony_ci    'rowNamesLen': rowNamesLen,
197df226684Sopenharmony_ci    'showNamesArr': showNamesArr,
198df226684Sopenharmony_ci    'hideNamesNum': hideNamesNum
199df226684Sopenharmony_ci  } as Record<string, number | AuthAccount[] | string>
200df226684Sopenharmony_ci}
201df226684Sopenharmony_ci
202df226684Sopenharmony_cilet toggleShow = (allNames: AuthAccount[], showNamesArr: AuthAccount[], editFlag: boolean, rowNamesLen: number) => {
203df226684Sopenharmony_ci  if (showNamesArr.length < allNames.length) {
204df226684Sopenharmony_ci    let showFlag = !editFlag;
205df226684Sopenharmony_ci    let showNamesArr = allNames;
206df226684Sopenharmony_ci    return {
207df226684Sopenharmony_ci      'showNamesArr': showNamesArr,
208df226684Sopenharmony_ci      'showFlag': showFlag
209df226684Sopenharmony_ci    } as Record<string, AuthAccount[] | boolean>;
210df226684Sopenharmony_ci  } else {
211df226684Sopenharmony_ci    let showFlag = !editFlag;
212df226684Sopenharmony_ci    let showNamesArr = allNames.length > Constants.ENCRYPTION_DOUBLED_NUMBER * rowNamesLen
213df226684Sopenharmony_ci      ? allNames.slice(0, Constants.ENCRYPTION_DOUBLED_NUMBER * rowNamesLen - 1)
214df226684Sopenharmony_ci      : allNames.slice(0, Constants.ENCRYPTION_DOUBLED_NUMBER * rowNamesLen);
215df226684Sopenharmony_ci    return {
216df226684Sopenharmony_ci      'showNamesArr': showNamesArr,
217df226684Sopenharmony_ci      'showFlag': showFlag
218df226684Sopenharmony_ci    } as Record<string, AuthAccount[] | boolean>;
219df226684Sopenharmony_ci  }
220df226684Sopenharmony_ci}
221df226684Sopenharmony_ci
222df226684Sopenharmony_cifunction directionStatus(func: Callback<number>) {
223df226684Sopenharmony_ci  let innerEvent: emitter.InnerEvent = {
224df226684Sopenharmony_ci    eventId: Constants.ENCRYPTION_EMIT_DIRECTION_STATUS
225df226684Sopenharmony_ci  };
226df226684Sopenharmony_ci  emitter.on(innerEvent, (eventData: emitter.EventData) => {
227df226684Sopenharmony_ci    func(eventData.data?.direction);
228df226684Sopenharmony_ci  });
229df226684Sopenharmony_ci}
230df226684Sopenharmony_ci
231df226684Sopenharmony_cifunction getAppId(bundleName: string) {
232df226684Sopenharmony_ci  return new Promise<string>(async (resolve, reject) => {
233df226684Sopenharmony_ci    let bundleFlags: number = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO;
234df226684Sopenharmony_ci    let userId = await getUserId();
235df226684Sopenharmony_ci    try {
236df226684Sopenharmony_ci      let data = await bundleManager.getBundleInfo(bundleName, bundleFlags, userId);
237df226684Sopenharmony_ci      if (data.signatureInfo.appId) {
238df226684Sopenharmony_ci        resolve(data.signatureInfo.appId);
239df226684Sopenharmony_ci        return;
240df226684Sopenharmony_ci      }
241df226684Sopenharmony_ci      reject();
242df226684Sopenharmony_ci    } catch (err) {
243df226684Sopenharmony_ci      HiLog.error(TAG, `get appId failed: ${JSON.stringify(err)}`);
244df226684Sopenharmony_ci      reject();
245df226684Sopenharmony_ci    }
246df226684Sopenharmony_ci  })
247df226684Sopenharmony_ci}
248df226684Sopenharmony_ci
249df226684Sopenharmony_cifunction getTime() {
250df226684Sopenharmony_ci  let permanent: boolean | undefined = AppStorage.get('permanent');
251df226684Sopenharmony_ci  if (permanent) {
252df226684Sopenharmony_ci    return $r('app.string.permanently');
253df226684Sopenharmony_ci  }
254df226684Sopenharmony_ci  let dateTime: number | undefined = AppStorage.get('validity');
255df226684Sopenharmony_ci  if (dateTime !== undefined) {
256df226684Sopenharmony_ci    let date = new Date(dateTime);
257df226684Sopenharmony_ci    let year = date.getFullYear();
258df226684Sopenharmony_ci    let month = date.getMonth() + 1;
259df226684Sopenharmony_ci    let day = date.getDate();
260df226684Sopenharmony_ci    let hour = date.getHours();
261df226684Sopenharmony_ci    let minute = date.getMinutes();
262df226684Sopenharmony_ci    return `${year}/${month}/${day} ${hour}:${minute}`;
263df226684Sopenharmony_ci  } else {
264df226684Sopenharmony_ci    return '';
265df226684Sopenharmony_ci  }
266df226684Sopenharmony_ci}
267df226684Sopenharmony_ci
268df226684Sopenharmony_ciasync function getFileSizeByUri(uri: string): Promise<number> {
269df226684Sopenharmony_ci  let inFile: fs.File | undefined;
270df226684Sopenharmony_ci  try {
271df226684Sopenharmony_ci    inFile = await fs.open(uri, fs.OpenMode.READ_ONLY);
272df226684Sopenharmony_ci    let stat = await fs.stat(inFile.fd);
273df226684Sopenharmony_ci    HiLog.info(TAG, `get file info succeed, the size of file is: ${stat.size}`);
274df226684Sopenharmony_ci    return stat.size;
275df226684Sopenharmony_ci  } catch (err) {
276df226684Sopenharmony_ci    HiLog.error(TAG, `open: ${uri}, failed: ${JSON.stringify(err)}`);
277df226684Sopenharmony_ci    HiLog.info(TAG, `get file info failed with error message: ${JSON.stringify(err)}`);
278df226684Sopenharmony_ci    return -1;
279df226684Sopenharmony_ci  } finally {
280df226684Sopenharmony_ci    if (inFile) {
281df226684Sopenharmony_ci      fs.closeSync(inFile);
282df226684Sopenharmony_ci    }
283df226684Sopenharmony_ci  }
284df226684Sopenharmony_ci}
285df226684Sopenharmony_ci
286df226684Sopenharmony_cifunction getDLPInfo() {
287df226684Sopenharmony_ci  return new Promise<DLPInfo>(async (resolve, reject) => {
288df226684Sopenharmony_ci    let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT;
289df226684Sopenharmony_ci    try {
290df226684Sopenharmony_ci      bundleManager.getBundleInfoForSelf(bundleFlags, (err, data) => {
291df226684Sopenharmony_ci        if (err) {
292df226684Sopenharmony_ci          HiLog.error(TAG, `getBundleInfoForSelf failed. Cause: ${JSON.stringify(err)}`);
293df226684Sopenharmony_ci          reject({name: '', versionCode: ''});
294df226684Sopenharmony_ci        } else {
295df226684Sopenharmony_ci          resolve({name: data.name, versionCode: data.versionCode.toString()});
296df226684Sopenharmony_ci        }
297df226684Sopenharmony_ci      });
298df226684Sopenharmony_ci    } catch (err) {
299df226684Sopenharmony_ci      HiLog.error(TAG, `getBundleInfoForSelf failed. Cause: ${JSON.stringify(err)}`);
300df226684Sopenharmony_ci      reject({name: '', versionCode: ''});
301df226684Sopenharmony_ci    }
302df226684Sopenharmony_ci  })
303df226684Sopenharmony_ci}
304df226684Sopenharmony_ci
305df226684Sopenharmony_cifunction sendDlpManagerAccountLogin(errorCode: number) {
306df226684Sopenharmony_ci  let event: hiSysEvent.SysEventInfo = {
307df226684Sopenharmony_ci    domain: 'DLP_UE',
308df226684Sopenharmony_ci    name: 'DLP_MANAGER_ACCOUNT_LOGIN',
309df226684Sopenharmony_ci    eventType: hiSysEvent?.EventType?.BEHAVIOR,
310df226684Sopenharmony_ci    params: {
311df226684Sopenharmony_ci      'PNAMEID': AppStorage.get('hiPNameId') ?? '',
312df226684Sopenharmony_ci      'PVERSIONID': AppStorage.get('hiPVersionId') ?? '',
313df226684Sopenharmony_ci      'ACCOUNT_TYPE': AppStorage.get('hiAccountType') ?? '',
314df226684Sopenharmony_ci      'ACCOUNT_STATUS': AppStorage.get('hiAccountStatus') ?? -1,
315df226684Sopenharmony_ci      'LOGIN_FAIL_CODE': errorCode ?? -1,
316df226684Sopenharmony_ci      'PKG_NAME': AppStorage.get('hiPkgName') ?? '',
317df226684Sopenharmony_ci    } as Record<string, number>
318df226684Sopenharmony_ci  };
319df226684Sopenharmony_ci
320df226684Sopenharmony_ci  try {
321df226684Sopenharmony_ci    hiSysEvent.write(event);
322df226684Sopenharmony_ci  } catch (err) {
323df226684Sopenharmony_ci    HiLog.error(TAG, `sendDlpManagerAccountLogin failed`);
324df226684Sopenharmony_ci  }
325df226684Sopenharmony_ci}
326df226684Sopenharmony_ci
327df226684Sopenharmony_cifunction sendDlpManagerFileConfiguration() {
328df226684Sopenharmony_ci  let event: hiSysEvent.SysEventInfo = {
329df226684Sopenharmony_ci    domain: 'DLP_UE',
330df226684Sopenharmony_ci    name: 'DLP_MANAGER_FILE_CONFIGURATION',
331df226684Sopenharmony_ci    eventType: hiSysEvent?.EventType?.BEHAVIOR,
332df226684Sopenharmony_ci    params: {
333df226684Sopenharmony_ci      'PNAMEID': AppStorage.get('hiPNameId') ?? '',
334df226684Sopenharmony_ci      'PVERSIONID': AppStorage.get('hiPVersionId') ?? '',
335df226684Sopenharmony_ci      'OPERATION': AppStorage.get('hiOperation') ?? '',
336df226684Sopenharmony_ci      'READ_SCOPE': AppStorage.get('hiReadScope') ?? '',
337df226684Sopenharmony_ci      'WRITE_SCOPE': AppStorage.get('hiWriteScope') ?? '',
338df226684Sopenharmony_ci      'ADVANCED_SETTINGS': AppStorage.get('hiAdvancedSettings') ?? false,
339df226684Sopenharmony_ci      'STORE_PATH': AppStorage.get('hiStorePath') ?? false,
340df226684Sopenharmony_ci      'ACCOUNT_VERIFY_SUCC': AppStorage.get('hiAccountVerifySucc') ?? -1,
341df226684Sopenharmony_ci      'ACCOUNT_VERIFY_FAIL': AppStorage.get('hiAccountVerifyFail') ?? -1,
342df226684Sopenharmony_ci      'VALID_DATE': AppStorage.get('hiValidDate') ?? false,
343df226684Sopenharmony_ci    } as Record<string, number>
344df226684Sopenharmony_ci  };
345df226684Sopenharmony_ci
346df226684Sopenharmony_ci  try {
347df226684Sopenharmony_ci    hiSysEvent.write(event);
348df226684Sopenharmony_ci  } catch (err) {
349df226684Sopenharmony_ci    HiLog.error(TAG, `sendDlpManagerFileConfiguration failed`);
350df226684Sopenharmony_ci  }
351df226684Sopenharmony_ci}
352df226684Sopenharmony_ci
353df226684Sopenharmony_cifunction sendDlpFileCreateProperties(accountType: number) {
354df226684Sopenharmony_ci  let event: hiSysEvent.SysEventInfo = {
355df226684Sopenharmony_ci    domain: 'DLP_UE',
356df226684Sopenharmony_ci    name: 'DLP_FILE_CREATE_EVENT',
357df226684Sopenharmony_ci    eventType: hiSysEvent?.EventType?.BEHAVIOR,
358df226684Sopenharmony_ci    params: {
359df226684Sopenharmony_ci      'ACCOUNT_TYPE': accountType,
360df226684Sopenharmony_ci      'PNAMEID': AppStorage.get('hiPNameId') ?? '',
361df226684Sopenharmony_ci      'PVERSIONID': AppStorage.get('hiPVersionId') ?? '',
362df226684Sopenharmony_ci      'CODE': AppStorage.get('hiCode') ?? -1,
363df226684Sopenharmony_ci      'FILE_SIZE': AppStorage.get('hiFileSize') ?? -1,
364df226684Sopenharmony_ci      'FILE_TYPE': AppStorage.get('hiFileType') ?? '',
365df226684Sopenharmony_ci      'POLICY_SIZE_ENC': AppStorage.get('hiPolicySizeEnc') ?? -1,
366df226684Sopenharmony_ci      'PKG_NAME': AppStorage.get('hiPkgName') ?? '',
367df226684Sopenharmony_ci    } as Record<string, number>
368df226684Sopenharmony_ci  };
369df226684Sopenharmony_ci
370df226684Sopenharmony_ci  try {
371df226684Sopenharmony_ci    hiSysEvent.write(event);
372df226684Sopenharmony_ci  } catch (err) {
373df226684Sopenharmony_ci    HiLog.error(TAG, `sendDlpFileCreateProperties failed`);
374df226684Sopenharmony_ci  }
375df226684Sopenharmony_ci}
376df226684Sopenharmony_ci
377df226684Sopenharmony_cifunction sendDlpFileOpenProperties() {
378df226684Sopenharmony_ci  let event: hiSysEvent.SysEventInfo = {
379df226684Sopenharmony_ci    domain: 'DLP_UE',
380df226684Sopenharmony_ci    name: 'DLP_FILE_OPEN_EVENT',
381df226684Sopenharmony_ci    eventType: hiSysEvent?.EventType?.BEHAVIOR,
382df226684Sopenharmony_ci    params: {
383df226684Sopenharmony_ci      'PNAMEID': AppStorage.get('hiPNameId') ?? '',
384df226684Sopenharmony_ci      'PVERSIONID': AppStorage.get('hiPVersionId') ?? '',
385df226684Sopenharmony_ci      'CODE': AppStorage.get('hiCode') ?? -1,
386df226684Sopenharmony_ci      'SANDBOX_PKGNAME': AppStorage.get('hiSandboxPkgName') ?? '',
387df226684Sopenharmony_ci      'SANDBOX_INDEX': AppStorage.get('hiSandboxIndex') ?? -1,
388df226684Sopenharmony_ci      'ACCOUNT_TYPE': AppStorage.get('hiAccountType') ?? '',
389df226684Sopenharmony_ci      'FILE_SIZE': AppStorage.get('hiFileSize') ?? -1,
390df226684Sopenharmony_ci      'POLICY_SIZE_ENC': AppStorage.get('hiPolicySizeEnc') ?? -1,
391df226684Sopenharmony_ci    } as Record<string, number>
392df226684Sopenharmony_ci  };
393df226684Sopenharmony_ci
394df226684Sopenharmony_ci  try {
395df226684Sopenharmony_ci    hiSysEvent.write(event);
396df226684Sopenharmony_ci  } catch (err) {
397df226684Sopenharmony_ci    HiLog.error(TAG, `sendDlpFileOpenProperties failed`);
398df226684Sopenharmony_ci  }
399df226684Sopenharmony_ci}
400df226684Sopenharmony_ci
401df226684Sopenharmony_cifunction isValidPath(path: string): Boolean {
402df226684Sopenharmony_ci  if (path.indexOf('/./') !== -1 || path.indexOf('/../') !== -1) {
403df226684Sopenharmony_ci    return false;
404df226684Sopenharmony_ci  }
405df226684Sopenharmony_ci  return true;
406df226684Sopenharmony_ci}
407df226684Sopenharmony_ci
408df226684Sopenharmony_cifunction getAccountType(
409df226684Sopenharmony_ci  context: common.ServiceExtensionContext | common.UIExtensionContext, fd: number): Promise<number> {
410df226684Sopenharmony_ci  return new Promise(async (resolve, reject) => {
411df226684Sopenharmony_ci    let z = new ArrayBuffer(HEAD_LENGTH_IN_BYTE);
412df226684Sopenharmony_ci    let option: ChangeOption = { offset: 0, length: HEAD_LENGTH_IN_BYTE };
413df226684Sopenharmony_ci    let num = fs.readSync(fd, z, option);
414df226684Sopenharmony_ci    let buf = new Uint32Array(z, 0, HEAD_LENGTH_IN_U32);
415df226684Sopenharmony_ci    if (buf && buf[0] === Constants.DLP_ZIP_MAGIC) {
416df226684Sopenharmony_ci      let random = String(Math.random()).substring(Constants.RAND_START, Constants.RAND_END);
417df226684Sopenharmony_ci      let filePath = context.filesDir + '/saveAs' + random;
418df226684Sopenharmony_ci      let dirPath = context.filesDir + '/saveAsUnzip' + random;
419df226684Sopenharmony_ci      let fileName = dirPath + '/dlp_cert';
420df226684Sopenharmony_ci      let ff: fs.File | undefined;
421df226684Sopenharmony_ci      try {
422df226684Sopenharmony_ci        fs.readSync(fd, z, option);
423df226684Sopenharmony_ci        ff = await fs.open(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
424df226684Sopenharmony_ci        await fs.copyFile(fd, ff.fd);
425df226684Sopenharmony_ci        await fs.mkdir(dirPath);
426df226684Sopenharmony_ci        await zlib.decompressFile(filePath, dirPath);
427df226684Sopenharmony_ci        let dlpInfo = fs.readTextSync(fileName);
428df226684Sopenharmony_ci        let infoArray = dlpInfo.split('accountType');
429df226684Sopenharmony_ci        let type = infoArray[1].slice(Constants.TYPE_START, Constants.TYPE_END);
430df226684Sopenharmony_ci        GlobalContext.store('accountType', Number(type));
431df226684Sopenharmony_ci        resolve(Number(type));
432df226684Sopenharmony_ci      } catch (err) {
433df226684Sopenharmony_ci        HiLog.error(TAG, `decompressFile: ${JSON.stringify(err)}`);
434df226684Sopenharmony_ci        reject();
435df226684Sopenharmony_ci      } finally {
436df226684Sopenharmony_ci        closeFile(ff);
437df226684Sopenharmony_ci        deleteFile(filePath);
438df226684Sopenharmony_ci        removeDir(dirPath);
439df226684Sopenharmony_ci      }
440df226684Sopenharmony_ci    } else {
441df226684Sopenharmony_ci      let cert = new ArrayBuffer(buf[CERT_SIZE]);
442df226684Sopenharmony_ci      option = { offset: buf[CERT_OFFSET], length: buf[CERT_SIZE] };
443df226684Sopenharmony_ci      num = fs.readSync(fd, cert, option);
444df226684Sopenharmony_ci      try {
445df226684Sopenharmony_ci        let textDecoder: util.TextDecoder = util.TextDecoder.create('utf-8');
446df226684Sopenharmony_ci        let fdString: string = textDecoder.decodeWithStream(new Uint8Array(cert), { stream: false });
447df226684Sopenharmony_ci        let infoArray = fdString.split('accountType');
448df226684Sopenharmony_ci        let type = infoArray[1].slice(Constants.TYPE_START, Constants.TYPE_END);
449df226684Sopenharmony_ci        GlobalContext.store('accountType', Number(type));
450df226684Sopenharmony_ci        resolve(Number(type));
451df226684Sopenharmony_ci      } catch (err) {
452df226684Sopenharmony_ci        HiLog.error(TAG, `getStringFromFd error: ${JSON.stringify(err)}`);
453df226684Sopenharmony_ci        reject();
454df226684Sopenharmony_ci      }
455df226684Sopenharmony_ci    }
456df226684Sopenharmony_ci  })
457df226684Sopenharmony_ci}
458df226684Sopenharmony_ci
459df226684Sopenharmony_cifunction closeFile(file: fs.File | undefined) {
460df226684Sopenharmony_ci  try {
461df226684Sopenharmony_ci    if (file) {
462df226684Sopenharmony_ci      fs.closeSync(file);
463df226684Sopenharmony_ci    }
464df226684Sopenharmony_ci  } catch (err) {
465df226684Sopenharmony_ci    HiLog.error(TAG, `closeSync: ${JSON.stringify(err)}`);
466df226684Sopenharmony_ci  }
467df226684Sopenharmony_ci}
468df226684Sopenharmony_ci
469df226684Sopenharmony_cifunction deleteFile(file: string) {
470df226684Sopenharmony_ci  try {
471df226684Sopenharmony_ci    let res = fs.accessSync(file);
472df226684Sopenharmony_ci    if (res) {
473df226684Sopenharmony_ci      fs.unlinkSync(file);
474df226684Sopenharmony_ci    }
475df226684Sopenharmony_ci  } catch (err) {
476df226684Sopenharmony_ci    HiLog.error(TAG, `deleteFile: ${JSON.stringify(err)}`);
477df226684Sopenharmony_ci  }
478df226684Sopenharmony_ci}
479df226684Sopenharmony_ci
480df226684Sopenharmony_cifunction removeDir(file: string) {
481df226684Sopenharmony_ci  try {
482df226684Sopenharmony_ci    let res = fs.accessSync(file);
483df226684Sopenharmony_ci    if (res) {
484df226684Sopenharmony_ci      fs.rmdirSync(file);
485df226684Sopenharmony_ci    }
486df226684Sopenharmony_ci  } catch (err) {
487df226684Sopenharmony_ci    HiLog.error(TAG, `rmdirSync: ${JSON.stringify(err)}`);
488df226684Sopenharmony_ci  }
489df226684Sopenharmony_ci}
490df226684Sopenharmony_ci
491df226684Sopenharmony_cifunction checkNetworkStatus(): Promise<void> {
492df226684Sopenharmony_ci  return new Promise((resolve, reject) => {
493df226684Sopenharmony_ci    let netHandle = connection.getDefaultNetSync();
494df226684Sopenharmony_ci    connection.getNetCapabilities(netHandle, (error: BusinessError, data: connection.NetCapabilities) => {
495df226684Sopenharmony_ci      if (error) {
496df226684Sopenharmony_ci        HiLog.error(TAG, `checkNetworkStatus failed: ${JSON.stringify(error)}`);
497df226684Sopenharmony_ci        reject();
498df226684Sopenharmony_ci        return;
499df226684Sopenharmony_ci      };
500df226684Sopenharmony_ci      HiLog.info(TAG, `network Succeeded to get data: ${JSON.stringify(data)}`);
501df226684Sopenharmony_ci      const result = [connection.NetCap.NET_CAPABILITY_INTERNET, connection.NetCap.NET_CAPABILITY_VALIDATED]
502df226684Sopenharmony_ci        .every(element => data.networkCap?.includes(element));
503df226684Sopenharmony_ci      if (result) {
504df226684Sopenharmony_ci        resolve();
505df226684Sopenharmony_ci        return;
506df226684Sopenharmony_ci      }
507df226684Sopenharmony_ci      reject();
508df226684Sopenharmony_ci    })
509df226684Sopenharmony_ci  })
510df226684Sopenharmony_ci}
511df226684Sopenharmony_ci
512df226684Sopenharmony_ciexport {
513df226684Sopenharmony_ci  AuthAccount,
514df226684Sopenharmony_ci  PermissionType,
515df226684Sopenharmony_ci  getOsAccountInfo,
516df226684Sopenharmony_ci  checkDomainAccountInfo,
517df226684Sopenharmony_ci  getUserId,
518df226684Sopenharmony_ci  getAuthPerm,
519df226684Sopenharmony_ci  terminateSelfWithResult,
520df226684Sopenharmony_ci  judgeIsSandBox,
521df226684Sopenharmony_ci  getFileFd,
522df226684Sopenharmony_ci  getFileUriByPath,
523df226684Sopenharmony_ci  removeDuplicate,
524df226684Sopenharmony_ci  calculate,
525df226684Sopenharmony_ci  toggleShow,
526df226684Sopenharmony_ci  directionStatus,
527df226684Sopenharmony_ci  getAppId,
528df226684Sopenharmony_ci  getTime,
529df226684Sopenharmony_ci  getFileSizeByUri,
530df226684Sopenharmony_ci  getDLPInfo,
531df226684Sopenharmony_ci  sendDlpManagerAccountLogin,
532df226684Sopenharmony_ci  sendDlpManagerFileConfiguration,
533df226684Sopenharmony_ci  sendDlpFileCreateProperties,
534df226684Sopenharmony_ci  sendDlpFileOpenProperties,
535df226684Sopenharmony_ci  DLPInfo,
536df226684Sopenharmony_ci  isValidPath,
537df226684Sopenharmony_ci  defaultDlpFile,
538df226684Sopenharmony_ci  getAccountType,
539df226684Sopenharmony_ci  checkNetworkStatus
540df226684Sopenharmony_ci};
541