数据防泄漏服务开发指导(C/C++)
==================

数据防泄漏（Data Loss Prevention，DLP）是系统提供的系统级的数据防泄漏解决方案，提供跨设备的文件的权限管理、加密存储、授权访问等能力。

*   权限管理：查询当前DLP沙箱的权限信息。
*   文件信息获取：获取DLP文件的基本信息，如原始文件名。
*   沙箱环境检测：查询当前应用是否运行在DLP沙箱环境。
*   配置管理：设置、获取和清理沙箱应用配置信息。

#### 接口说明

数据防泄漏服务关键接口如下表所示。具体API说明详见[API参考](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-dlp-permission-api-h)

| 名称 | 描述 |
| :-- | :-- |
| DLP\_ErrCode OH\_DLP\_GetDlpPermissionInfo(DLP\_FileAccess \*dlpFileAccess, uint32\_t \*flags) | 查询当前DLP沙箱的权限信息。 |
| DLP\_ErrCode OH\_DLP\_GetOriginalFileName(const char \*fileName, char \*\*originalFileName) | 获取指定DLP文件名的原始文件名。 |
| DLP\_ErrCode OH\_DLP\_IsInSandbox(bool \*isInSandbox) | 查询当前应用是否运行在DLP沙箱环境。 |
| DLP\_ErrCode OH\_DLP\_SetSandboxAppConfig(const char \*configInfo) | 设置沙箱应用配置信息。 |
| DLP\_ErrCode OH\_DLP\_GetSandboxAppConfig(char \*\*configInfo) | 获取沙箱应用配置信息。 |
| DLP\_ErrCode OH\_DLP\_CleanSandboxAppConfig() | 清理沙箱应用配置信息。 |

#### 开发步骤

1.  在CMakeLists.txt中导入数据防泄漏的共享库，并链接该库。
    
    cmake\_minimum\_required(VERSION 3.5.0)
    project(DlpApiTest)
    
    set(NATIVERENDER\_ROOT\_PATH ${CMAKE\_CURRENT\_SOURCE\_DIR})
    
    if(DEFINED PACKAGE\_FIND\_FILE)
        include(${PACKAGE\_FIND\_FILE})
    endif()
    
    include\_directories(${NATIVERENDER\_ROOT\_PATH}
                        ${NATIVERENDER\_ROOT\_PATH}/include)
    
    add\_library(entry SHARED napi\_init.cpp)
    target\_link\_libraries(entry PUBLIC libace\_napi.z.so libohdlp\_permission.so)
    
2.  导入数据防泄漏服务的头文件和NAPI相关头文件。
    
    #include "napi/native\_api.h"
    #include <cstdint>
    #include <cstdlib>
    #include "DataProtectionKit/dlp\_permission\_api.h"
    
3.  查询当前DLP沙箱的权限信息。
    
    static napi\_value GetDlpPermissionInfo(napi\_env env, napi\_callback\_info info)
    {
        DLP\_FileAccess dlpFileAccess = NO\_PERMISSION;
        uint32\_t flags = 0;
        DLP\_ErrCode ret = OH\_DLP\_GetDlpPermissionInfo(&dlpFileAccess, &flags);
        if (ret == DLP\_ErrCode::ERR\_OH\_SUCCESS) {
            napi\_value result\[2\] = {nullptr};
            napi\_create\_int32(env, dlpFileAccess, &result\[0\]);
            napi\_create\_int32(env, flags, &result\[1\]);
            return result\[1\];
        }
        napi\_value result = nullptr;
        napi\_create\_int32(env, ret, &result);
        return result;
    }
    
4.  获取指定DLP文件名的原始文件名。
    
    static napi\_value GetOriginalFileName(napi\_env env, napi\_callback\_info info)
    {
        const char \*fileName = "test.txt.dlp";
        char \*originalFileName = nullptr;
        DLP\_ErrCode ret = OH\_DLP\_GetOriginalFileName(fileName, &originalFileName);
        if (ret == DLP\_ErrCode::ERR\_OH\_SUCCESS) {
            napi\_value result = nullptr;
            napi\_create\_string\_utf8(env, originalFileName, NAPI\_AUTO\_LENGTH, &result);
            return result;
        }
        napi\_value result = nullptr;
        napi\_create\_int32(env, ret, &result);
        free(originalFileName);
        return result;
    }
    
5.  查询当前应用是否运行在DLP沙箱环境。
    
    static napi\_value IsInSandbox(napi\_env env, napi\_callback\_info info)
    {
        bool isInSandbox = false;
        DLP\_ErrCode ret = OH\_DLP\_IsInSandbox(&isInSandbox);
        if (ret == DLP\_ErrCode::ERR\_OH\_SUCCESS) {
            napi\_value result = nullptr;
            napi\_get\_boolean(env, isInSandbox, &result);
            return result;
        }
        napi\_value result = nullptr;
        napi\_create\_int32(env, ret, &result);
        return result;
    }
    
6.  设置沙箱应用配置信息。
    
    static napi\_value SetSandboxAppConfig(napi\_env env, napi\_callback\_info info)
    {
        const char \*configInfo = "configInfo";
        DLP\_ErrCode ret = OH\_DLP\_SetSandboxAppConfig(configInfo);
     
        napi\_value result = nullptr;
        napi\_create\_int32(env, ret, &result);
        return result;
    }
    
7.  获取沙箱应用配置信息。
    
    static napi\_value GetSandboxAppConfig(napi\_env env, napi\_callback\_info info)
    {
        char \*configInfo = nullptr;
        DLP\_ErrCode ret = OH\_DLP\_GetSandboxAppConfig(&configInfo);
        if (ret == DLP\_ErrCode::ERR\_OH\_SUCCESS) {
            napi\_value result = nullptr;
            napi\_create\_string\_utf8(env, configInfo, NAPI\_AUTO\_LENGTH, &result);
            return result;
        }
        napi\_value result = nullptr;
        napi\_create\_int32(env, ret, &result);
        free(configInfo);
        return result;
    }
    
8.  清理沙箱应用配置信息。
    
    static napi\_value CleanSandboxAppConfig(napi\_env env, napi\_callback\_info info)
    {
        DLP\_ErrCode ret = OH\_DLP\_CleanSandboxAppConfig();
     
        napi\_value result = nullptr;
        napi\_create\_int32(env, ret, &result);
        return result;
    }