Panduan Cepat Penerbitan Ulang File SDK (C++)

Gambaran Umum

Untuk gambaran umum tentang skenario ini dan di mana skenario tersebut dapat digunakan, lihat Menerbitkan ulang di MIP SDK.

Prasyarat

Jika Anda belum melakukannya, pastikan untuk menyelesaikan prasyarat berikut sebelum melanjutkan:

  • Selesaikan Mulai Cepat: Tetapkan/dapatkan label sensitivitas (C++) terlebih dahulu, yang membangun solusi awal Visual Studio, untuk mencantumkan label sensitivitas milik organisasi, serta untuk menetapkan dan membaca label sensitivitas ke/dari sebuah file. Panduan Mulai Cepat "Cara - Menurunkan/Menghapus label yang memerlukan alasan C++" ini melanjutkan dari panduan sebelumnya.
  • Secara opsional: Tinjau Penangan file dalam konsep MIP SDK.
  • Opsional: Tinjau Penanganan perlindungan dalam konsep MIP SDK.

Menambahkan logika ke kelas Pengamat FileHandler

Untuk dapat menggunakan metode mendekripsi file yang dilindungi dengan menggunakan GetDecryptedTemporaryFileAsync() yang diekspos oleh mip::FileHandler, panggilan balik untuk metode asinkron agar berhasil dan gagal harus didefinisikan seperti ini.

  1. Buka solusi Visual Studio yang Anda buat di "Mulai Cepat: Atur/dapatkan label sensitivitas (C++) sebelumnya.

  2. Gunakan Penjelajah Solusi, buka file filehandler_observer.h dalam proyek Anda. Menjelang akhir definisi FileHandler, sebelum }; menambahkan baris di bawah ini untuk deklarasi metode.

        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;
    
  3. Menggunakan Penjelajah Solusi, buka filehandler_observer.cpp file di proyek Anda. Menjelang akhir file, tambahkan baris di bawah ini untuk definisi metode.

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

Menambahkan logika untuk mengedit dan menerbitkan ulang file yang dilindungi

  1. Menggunakan Penjelajah Solusi, buka file .cpp dalam proyek Anda yang berisi implementasi main() metode . Ini menggunakan nama default yang sama dengan proyek yang memuatnya, yang Anda tentukan selama pembuatan proyek.

  2. Menuju akhir isi main(), di bawah system("pause"); dan di atas return 0; (tempat Anda berhenti sebelumnya pada Quickstart), sisipkan kode berikut:

//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;
}
  1. Menjelang akhir Main() temukan blok matikan aplikasi yang dibuat di mulai cepat sebelumnya dan tambahkan baris handler di bawah ini untuk merilis sumber daya.

        protectedFileHandler = nullptr;
        protectionHandler = nullptr;
    
    
  2. Ganti nilai tempat penampung dalam kode sumber menggunakan nilai berikut:

    Pengganti sementara Nilai
    <jalur-berkas-terlindungi> File yang dilindungi dari panduan cepat sebelumnya.
    <jalur file yang dilindungi ulang> Jalur file output untuk file yang dimodifikasi untuk diterbitkan ulang.

Membangun dan menguji aplikasi

Buat dan uji aplikasi klien Anda.

  1. Gunakan CTRL-SHIFT-B (Build Solution) untuk membangun aplikasi klien Anda. Jika tidak ada kesalahan build, gunakan F5 (Mulai debugging) untuk menjalankan aplikasi Anda.

  2. Jika proyek Anda berhasil membangun dan berjalan, aplikasi meminta token akses, setiap kali SDK memanggil metode Anda AcquireOAuth2Token() . Seperti yang telah Anda lakukan sebelumnya di Panduan Cepat "Mengatur/Mendapatkan Sensitivity Label", jalankan skrip PowerShell Anda untuk mendapatkan token setiap kali, menggunakan nilai yang disediakan untuk $authority dan $resourceUrl.

  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.microsoftonline.com/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 . . .