Dosya SDK'sı Yeniden Yayımlama Hızlı Başlangıcı (C++)

Genel Bakış

Bu senaryoya genel bakış ve nerede kullanılabileceğini öğrenmek için, bakınız MIP SDK'sında yeniden yayımlama.

Önkoşullar

Henüz yapmadıysanız devam etmeden önce aşağıdaki önkoşulları tamamladığınızdan emin olun:

  • İlk olarak bir başlangıç Visual Studio çözümü oluşturarak bir kuruluşun duyarlılık etiketlerini listelemek, dosyaya duyarlılık etiketlerini ayarlamak ve dosyadan okumak için Hızlı Başlangıç: Duyarlılık etiketlerini ayarla/al (C++) uygulamasını tamamlayın. Bu "Nasıl Yapılır - Gerekçelendirilmesi Gereken Bir C++ Etiketini Düşürme/Kaldırma" Hızlı Başlangıç, öncekine dayanmaktadır.
  • İsteğe bağlı olarak: MIP SDK kavramlarındaki Dosya işleyicilerini gözden geçirin.
  • İsteğe bağlı olarak: MIP SDK kavramlarındaki Koruma işleyicilerini gözden geçirin.

FileHandler Observer sınıfına mantık ekleme

Tarafından mip::FileHandler kullanıma sunulan GetDecryptedTemporaryFileAsync() yöntemini kullanarak korumalı bir dosyanın şifresini çözebilmek için, zaman uyumsuz yöntemin başarılı tamamlanma ve başarısızlık durumlarına yönelik geri çağırmaların aşağıdaki gibi tanımlanması gerekir.

  1. Önceki "Hızlı Başlangıç: Duyarlılık etiketlerini ayarlama/alma (C++) içinde oluşturduğunuz Visual Studio çözümünü açın.

  2. Çözüm Gezgini'ni kullanarak projenizdeki filehandler_observer.h dosyasını açın. FileHandler tanımının sonuna doğru, };'dan önce, yöntem bildirimi için aşağıdaki satırları ekleyin.

        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. Çözüm Gezgini'ni filehandler_observer.cpp kullanarak dosyayı projenizde açın. Dosyanın sonuna doğru yöntem tanımları için aşağıdaki satırları ekleyin.

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

Korumalı dosyayı düzenlemek ve yeniden yayımlamak için mantık ekleme

  1. Çözüm Gezgini'ni kullanarak, projenizde main() metodunun uygulamasını içeren .cpp dosyasını açın. Proje oluşturma sırasında belirlediğiniz isim, varsayılan olarak projeyle aynı olup onu içeren yapıdadır.

  2. main() bloğunun sonuna doğru, system("pause"); kodunun altında ve return 0; kodunun üstünde (önceki Hızlı Başlat'ta kaldığınız yere), aşağıdaki kodu ekleyin:

//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. Main() sonuna doğru, önceki hızlı başlangıçta oluşturulan uygulama kapatma bloğunu bulun ve kaynakları serbest bırakmak için aşağıdaki işleyici satırlarını ekleyin.

        protectedFileHandler = nullptr;
        protectionHandler = nullptr;
    
    
  2. Aşağıdaki değerleri kullanarak kaynak koddaki yer tutucu değerlerini değiştirin:

    Yer tutucu Değer
    <korunmuş dosya yolu> Önceki hızlı başlatmadan korunan dosya.
    <yeniden korunmuş dosya yolu> Değiştirilen dosyanın yeniden yayımlandığı çıkış dosyası yolu.

Uygulamayı derleme ve test etme

İstemci uygulamanızı derleyin ve test edin.

  1. İstemci uygulamanızı derlemek için CTRL-SHIFT-B (Çözümü Derle) kullanın. Derleme hatanız yoksa, uygulamanızı çalıştırmak için F5 (Hata ayıklamayı başlat) kullanın.

  2. Projeniz başarıyla derlenip çalıştırılırsa, SDK yönteminizi AcquireOAuth2Token() her çağırdığında uygulama bir erişim belirteci ister. Daha önce "Duyarlılık Etiketi Ayarla/Al" Hızlı Başlangıcı'nda yaptığınız gibi, $authority ve $resourceUrl için sağlanan değerleri kullanarak belirteci her seferinde almak için PowerShell betiğinizi çalıştırın.

  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 . . .