SDK 다시 게시 빠른 시작(C++)
개요
이 시나리오 및 이 시나리오를 사용할 수 있는 위치에 대한 개요는 MIP SDK에서 다시 게시를 참조하세요.
필수 조건
아직 완료하지 않은 경우 계속하기 전에 다음 필수 구성 요소를 완료해야 합니다.
- 먼저 시작 Visual Studio 솔루션을 구축하는 빠른 시작: 민감도 레이블 설정/가져오기(C++)를 완료하여 조직의 민감도 레이블을 나열하고 파일로/파일에서 민감도 레이블을 설정하고 읽습니다. 이 "방법 - 근거 C++가 필요한 레이블 다운그레이드/제거" 빠른 시작은 이전 항목을 기반으로 합니다.
- 선택 사항: MIP SDK의 파일 처리기 개념을 검토합니다.
- 선택 사항: MIP SDK의 보호 처리기 개념을 검토합니다.
FileHandler Observer 클래스에 논리 추가
mip::FileHandler
에서 노출된 GetDecryptedTemporaryFileAsync()
메서드를 사용하여 보호된 파일 해독을 사용하기 위해서는 아래와 같이 성공과 실패에 대한 비동기 메서드의 콜백을 정의해야 합니다.
이전 “빠른 시작: 민감도 레이블 설정/가져오기(C++)”에서 만든 Visual Studio 솔루션을 엽니다.
솔루션 탐색기를 사용하여 프로젝트에서
filehandler_observer.h
파일을 엽니다. FileHandler 정의의 끝을 향해};
앞에 메서드 선언에 대한 아래 줄을 추가합니다.void OnGetDecryptedTemporaryFileSuccess(const std::string& decryptedFilePath, const std::shared_ptr<void>& context) override; void OnGetDecryptedTemporaryFileFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
솔루션 탐색기를 사용하여 프로젝트에서
filehandler_observer.cpp
파일을 엽니다. 파일의 끝부분을 향해 메서드 정의에 대해 아래 줄을 추가합니다.void FileHandlerObserver::OnGetDecryptedTemporaryFileSuccess(const std::string& decryptedFilePath, const std::shared_ptr<void>& context) { auto promise = std::static_pointer_cast<std::promise<std::string>>(context); promise->set_value(decryptedFilePath); } void FileHandlerObserver::OnGetDecryptedTemporaryFileFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) { auto promise = std::static_pointer_cast<std::promise<std::string>>(context); promise->set_exception(error); }
보호된 파일을 편집하고 다시 게시하는 논리 추가
솔루션 탐색기를 사용하여
main()
메서드 구현을 포함하는 프로젝트에서 .cpp 파일을 엽니다. 기본값은 프로젝트 생성 중에 지정한 이름이 포함된 프로젝트와 동일한 이름입니다.main() 본문의 끝부분을 향해 시스템("중지") 아래 및 반환 0 위에(이전 빠른 시작에서 중단한 부분) 다음 코드를 삽입합니다.
//Originally protected file's path.
std::string protectedFilePath = "<protected-file-path>";
// Create file handler for the file
auto handlerPromise = std::make_shared<std::promise<std::shared_ptr<FileHandler>>>();
auto handlerFuture = handlerPromise->get_future();
engine->CreateFileHandlerAsync(protectedFilePath,
protectedFilePath,
true,
std::make_shared<FileHandlerObserver>(),
handlerPromise);
auto protectedFileHandler = handlerFuture.get();
// retieve and store protection handler from file
auto protectionHandler = protectedFileHandler->GetProtection();
//Check if the user has the 'Edit' right to the file and if so decrypt the file.
if (protectionHandler->AccessCheck("Edit")) {
// Decrypt file to temp path using the same file handler
auto tempPromise = std::make_shared<std::promise<string>>();
auto tempFuture = tempPromise->get_future();
protectedFileHandler->GetDecryptedTemporaryFileAsync(tempPromise);
auto tempPath = tempFuture.get();
/// Write code here to perform further operations for edit ///
/// Follow steps below for re-protecting the edited file ///
// Create a new file handler using the temporary file path.
auto reprotectPromise = std::make_shared<std::promise<std::shared_ptr<FileHandler>>>();
auto reprotectFuture = reprotectPromise->get_future();
engine->CreateFileHandlerAsync(tempPath,
tempPath,
true,
std::make_shared<FileHandlerObserver>(),
reprotectPromise);
auto republishHandler = reprotectFuture.get();
// Set protection using the ProtectionHandler from the original consumption operation.
republishHandler->SetProtection(protectionHandler);
std::string reprotectedFilePath = "<protected-file-path>";
// Commit changes
auto republishPromise = std::make_shared<std::promise<bool>>();
auto republishFuture = republishPromise->get_future();
republishHandler->CommitAsync(reprotectedFilePath, republishPromise);
// Validate republishing
cout << "Protected File: " + protectedFilePath<<endl;
cout << "Protected Label ID: " + protectedFileHandler->GetLabel()->GetLabel()->GetId() << endl;
cout << "Protection Owner: " + protectedFileHandler->GetProtection()->GetOwner() << endl<<endl;
cout << "Republished File: " + reprotectedFilePath<<endl;
cout << "Republished Label ID: " + republishHandler->GetLabel()->GetLabel()->GetId() << endl;
cout << "Republished Owner: " + republishHandler->GetProtection()->GetOwner() << endl;
}
Main()의 끝부분을 향해 이전 빠른 시작에서 만든 애플리케이션 종료 블록을 찾고 아래 처리기 줄을 추가하여 리소스를 릴리스합니다.
protectedFileHandler = nullptr; protectionHandler = nullptr;
다음 값을 사용하여 소스 코드의 자리 표시자 값을 바꿉니다.
자리 표시자 값 <protected-file-path> 이전 빠른 시작에서 보호된 파일입니다. <reprotected-file-path> 다시 게시할 수정된 파일의 출력 파일 경로입니다.
응용 프로그램 구축 및 테스트
클라이언트 애플리케이션을 빌드하고 테스트합니다.
CTRL-SHIFT-B(솔루션 빌드)를 사용하여 클라이언트 애플리케이션을 빌드합니다. 빌드 오류가 없는 경우 F5(디버깅 시작) 키를 사용하여 애플리케이션을 실행합니다.
프로젝트가 빌드 및 실행에 성공하면 SDK가
AcquireOAuth2Token()
메서드를 호출할 때마다 애플리케이션에서 액세스 토큰을 묻는 메시지가 표시됩니다. "민감도 레이블 설정/시작" 빠른 시작에서 이전에 수행한 것처럼 $authority 및 $resourceUrl에 대해 제공된 값을 사용하여 매번 PowerShell 스크립트를 실행하여 토큰을 획득합니다.
Sensitivity labels for your organization:
Non-Business : 87ba5c36-17cf-14793-bbc2-bd5b3a9f95cz
Public : 83867195-f2b8-2ac2-b0b6-6bb73cb33afz
General : f42a3342-8706-4288-bd31-ebb85995028z
Confidential : 074e457c-5848-4542-9a6f-34a182080e7z
Highly Confidential : f55c2dea-db0f-47cd-8520-a52e1590fb6z
Press any key to continue . . .
Applying Label ID 074e457c-5848-4542-9a6f-34a182080e7z to C:\Test\Test.docx
Committing changes
Label committed to file: C:\Test\Test_labeled.docx
Press any key to continue . . .
Run the PowerShell script to generate an access token using the following values, then copy/paste it below:
Set $authority to: https://login.windows.net/37f4583d-9985-4e7f-a1ab-71afd8b55ba0
Set $resourceUrl to: https://aadrm.com
Sign in with user account: user1@tenant.onmicrosoft.com
Enter access token: <paste-access-token-here>
Press any key to continue . . .
Getting the label committed to file: C:\Test\Test_labeled.docx
Name: Confidential
Id: 074e457c-5848-4542-9a6f-34a182080e7z
Press any key to continue . . .
Protected File: C:\Test\Test_labeled.docx
Protected Label ID: 074e457c-5848-4542-9a6f-34a182080e7z
Protection Owner: user1@tenant.onmicrosoft.com
Republished File: c:\Test\Test_republished.docx
Republished Label ID: 074e457c-5848-4542-9a6f-34a182080e7z
Republished Owner: user1@tenant.onmicrosoft.com
Press any key to close this window . . .