1/*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import dlpPermission from '@ohos.dlpPermission';
17import fileio from '@ohos.fileio';
18import GlobalContext from './GlobalContext';
19import { HiLog } from '../common/HiLog';
20
21const TAG = 'DataUtils';
22const INDEX_TWO = 2;
23const INDEX_ONE = 1;
24const INDEX_ZERO = 0;
25const INDEX_THREE = 3;
26const INDEX_FOUR = 4;
27const INDEX_FIVE = 5;
28
29interface DlpFileInfo {
30  dlpFile: dlpPermission.DLPFile;
31  tokenId: number;
32}
33
34async function deleteLinkFile(fileArray: (number | string | dlpPermission.DLPFile)[][]): Promise<void> {
35  HiLog.info(TAG, `deleteLinkFile enter`);
36  return new Promise(async (resolve, reject) => {
37    for (let linkFile of fileArray) {
38      if (linkFile.length <= INDEX_TWO) {
39        HiLog.error(TAG, `linkFile size:${linkFile.length} error`);
40        reject();
41        return;
42      }
43      let dlpFile: dlpPermission.DLPFile = linkFile[INDEX_ZERO] as dlpPermission.DLPFile;
44      try {
45        await dlpFile.deleteDLPLinkFile(linkFile[INDEX_ONE] as string);
46      } catch (err) {
47        HiLog.error(TAG, `deleteDLPLinkFile failed: ${JSON.stringify(err)}`);
48      }
49      try {
50        await dlpFile.closeDLPFile();
51      } catch (err) {
52        HiLog.error(TAG, `closeDLPFile failed: ${JSON.stringify(err)}`);
53      }
54      try {
55        fileio.closeSync(linkFile[INDEX_TWO] as number);
56      } catch (err) {
57        HiLog.error(TAG, `closeSync failed: ${JSON.stringify(err)}`);
58      }
59    }
60    resolve();
61  });
62}
63
64async function deleteSandbox2linkFileData(sandboxId: string, isNeedDeleteLink: boolean) : Promise<void> {
65    HiLog.info(TAG, `deleteSandbox2linkFileData enter`);
66    return new Promise(async (resolve, reject) => {
67      let sandbox2linkFile: Map<string, (number | string | dlpPermission.DLPFile)[][]> =
68        GlobalContext.load('sandbox2linkFile') as Map<string, (number | string | dlpPermission.DLPFile)[][]>;
69      if (!sandbox2linkFile.has(sandboxId)) {
70        HiLog.info(TAG, `deleteSandbox2linkFileData not found ${sandboxId}`);
71        resolve();
72        return;
73      }
74      try {
75        if (isNeedDeleteLink) {
76          await deleteLinkFile(sandbox2linkFile.get(sandboxId) as (number | string | dlpPermission.DLPFile)[][]);
77        }
78        sandbox2linkFile.delete(sandboxId);
79        resolve();
80      } catch (err) {
81        HiLog.error(TAG, `getHistoryDlpFile failed`);
82        reject();
83      }
84    });
85}
86
87async function deleteFileOpenHistoryData(dlpFileUri: string) : Promise<void> {
88  HiLog.info(TAG, `deleteFileOpenHistoryData enter`);
89    return new Promise(async (resolve, reject) => {
90      let fileOpenHistory:Map<string, (number | string)[]> =
91        GlobalContext.load('fileOpenHistory') as Map<string, (number | string)[]>;
92        fileOpenHistory.delete(dlpFileUri);
93        resolve();
94    });
95}
96
97async function deleteLinkSetData(linkUri: string) : Promise<void> {
98  HiLog.info(TAG, `deleteLinkSetData enter`);
99    return new Promise(async (resolve, reject) => {
100      (GlobalContext.load('linkSet') as Set<string>).delete(linkUri);
101      resolve();
102    });
103}
104
105async function deleteToken2FileData(tokenId: number) : Promise<void> {
106  HiLog.info(TAG, `deleteToken2FileData enter`);
107  return new Promise(async (resolve, reject) => {
108    (GlobalContext.load('token2File') as Map<number, (number | string | dlpPermission.DLPFile |
109      dlpPermission.DLPFileAccess | null)[]>).delete(tokenId);
110    resolve();
111  });
112}
113
114async function getDlpFileInfoFromSandbox2linkFileData(sandboxId: string, dlpFileUri:string) : Promise<DlpFileInfo> {
115  HiLog.info(TAG, `getDlpFileInfoFromSandbox2linkFileData enter`);
116  return new Promise(async (resolve, reject) => {
117    let sandbox2linkFile: Map<string, (number | string | dlpPermission.DLPFile)[][]> =
118        GlobalContext.load('sandbox2linkFile') as Map<string, (number | string | dlpPermission.DLPFile)[][]>;
119    if (!sandbox2linkFile.has(sandboxId)) {
120      HiLog.info(TAG, `getDlpFileInfoFromSandbox2linkFileData not found ${sandboxId}, ${dlpFileUri}`);
121      reject();
122      return;
123    }
124    let fileArray: (number | string | dlpPermission.DLPFile)[][] =
125      sandbox2linkFile.get(sandboxId) as (number | string | dlpPermission.DLPFile)[][];
126    for (let linkFile of fileArray) {
127      if (linkFile.length < INDEX_FIVE) {
128        continue;
129      }
130      if (linkFile[INDEX_FOUR] !== dlpFileUri) {
131        continue;
132      }
133      let result : DlpFileInfo = {
134        dlpFile: linkFile[INDEX_ZERO] as dlpPermission.DLPFile,
135        tokenId: linkFile[INDEX_THREE] as number
136      }
137      resolve(result);
138      return;
139    }
140    HiLog.info(TAG, `getDlpFileInfoFromSandbox2linkFileData not found in linkFile ${sandboxId}, ${dlpFileUri}`);
141    reject();
142  });
143}
144
145export {
146  DlpFileInfo,
147  deleteSandbox2linkFileData,
148  deleteFileOpenHistoryData,
149  deleteLinkSetData,
150  deleteToken2FileData,
151  getDlpFileInfoFromSandbox2linkFileData,
152};