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};