}// end:OnPublish()

        // ------------------------ PublishRMPackage --------------------------
        /// <summary>
        ///   Writes an encrypted righted managed package.</summary>
        /// <param name="packageFilepath">
        ///   The path and filename of the source document package.</param>
        /// <param name="filename">
        ///   The path and filename of the XrML rights management file.</param>
        /// <param name="encryptedFilepath">
        ///   The path and filename for writing the RM encrypted package.</param>
        /// <returns>
        ///   true if the encrypted package is written successfully;
        ///   otherwise false.</returns>
        public bool PublishRMPackage(
            string packageFile, string xrmlFile, string encryptedFile)
        {
            string xrmlString;

            // Extract individual filenames without the path.
            string packageFilename = packageFile.Remove(0,
                                                        packageFile.LastIndexOf('\\') + 1);
            string xrmlFilename = xrmlFile.Remove(0,
                                                  xrmlFile.LastIndexOf('\\') + 1);
            string encryptedFilename = encryptedFile.Remove(0,
                                                            encryptedFile.LastIndexOf('\\') + 1);

            try
            {
                WriteStatus("   Reading '" + xrmlFilename + "' permissions.");
                try
                {
                    StreamReader sr = File.OpenText(xrmlFile);
                    xrmlString = sr.ReadToEnd();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("ERROR: '" + xrmlFilename + "' open failed.\n" +
                                    "Exception: " + ex.Message, "XrML File Error",
                                    MessageBoxButton.OK, MessageBoxImage.Error);
                    return(false);
                }

                WriteStatus("   Building UnsignedPublishLicense");
                WriteStatus("       from '" + xrmlFilename + "'.");
                UnsignedPublishLicense unsignedLicense =
                    new UnsignedPublishLicense(xrmlString);
                ContentUser author = unsignedLicense.Owner;

                //<SnippetRmPkgPubGrants>
                // The XRML template <RANGETIME> and <INTERVALTIME> elements are
                // ignored by the UnsignedPublishLicense(xrmlString) constructor.
                // To specify these values for the license, the ContentGrant
                // ValidFrom and ValidUntil properties must be explicitly set.
                // The following code sample demonstrates how to set the
                // ContentGrant properties for ValidFrom and ValidUntil.

                // Create a copy of the original XRML template ContentGrants
                // set by the UnsignedPublishLicense(xrmlString) constructor.
                ICollection <ContentGrant> tmpGrants = new List <ContentGrant>();
                foreach (ContentGrant grant in unsignedLicense.Grants)
                {
                    tmpGrants.Add(grant);
                }

                // Erase all original UnsignedPublishLicense ContentGrants.
                unsignedLicense.Grants.Clear();

                // Add each original grant back to the UnsignedPublishLicense
                // with appropriate ValidFrom and ValidUntil date/time values.
                foreach (ContentGrant grant in tmpGrants)
                {
                    unsignedLicense.Grants.Add(new ContentGrant(
                                                   grant.User, grant.Right,
                                                   DateTime.MinValue,   // set ValidFrom as appropriate
                                                   DateTime.MaxValue)); // set ValidUntil as appropriate
                }
                //</SnippetRmPkgPubGrants>

                WriteStatus("   Building secure environment.");
                try
                {
                    string applicationManifest = "<manifest></manifest>";
                    if (File.Exists("rpc.xml"))
                    {
                        StreamReader manifestReader = File.OpenText("rpc.xml");
                        applicationManifest = manifestReader.ReadToEnd();
                    }

                    if (_secureEnv == null)
                    {
                        if (SecureEnvironment.IsUserActivated(new ContentUser(
                                                                  _currentUserId, AuthenticationType.Windows)))
                        {
                            _secureEnv = SecureEnvironment.Create(
                                applicationManifest, new ContentUser(
                                    _currentUserId, AuthenticationType.Windows));
                        }
                        else
                        {
                            _secureEnv = SecureEnvironment.Create(
                                applicationManifest,
                                AuthenticationType.Windows,
                                UserActivationMode.Permanent);
                        }
                    }
                }
                catch (RightsManagementException ex)
                {
                    MessageBox.Show("ERROR: Failed to build secure environment.\n" +
                                    "Exception: " + ex.Message + "\n\n" +
                                    ex.FailureCode.ToString() + "\n\n" + ex.StackTrace,
                                    "Rights Management Exception",
                                    MessageBoxButton.OK, MessageBoxImage.Error);
                    return(false);
                }

                // If using Windows authentication and the Xrml owner name
                // does not match the current log-in name, show error message
                if ((author.AuthenticationType == AuthenticationType.Windows) &&
                    (author.Name != _currentUserId))
                {
                    MessageBox.Show("ERROR: The current user name does not " +
                                    "match the UnsignedPublishLicense owner.\n" +
                                    "Please check the owner <NAME> element contained in '" +
                                    xrmlFilename + "'\n\n" +
                                    "Current user log-in ID: " + _currentUserId + "\n" +
                                    "XrML UnsignedPublishLicense owner name: " + author.Name,
                                    "Incorrect Authentication Name",
                                    MessageBoxButton.OK, MessageBoxImage.Error);
                    return(false);
                }

                WriteStatus("   Signing the UnsignedPublishLicense\n" +
                            "       to build the PublishLicense.");
                UseLicense     authorsUseLicense;
                PublishLicense publishLicense =
                    unsignedLicense.Sign(_secureEnv, out authorsUseLicense);

                WriteStatus("   Binding the author's UseLicense and");
                WriteStatus("       obtaining the CryptoProvider.");
                CryptoProvider cryptoProvider = authorsUseLicense.Bind(_secureEnv);

                WriteStatus("   Creating the EncryptedPackage.");
                Stream packageStream = File.OpenRead(packageFile);
                EncryptedPackageEnvelope ePackage =
                    EncryptedPackageEnvelope.CreateFromPackage(encryptedFile,
                                                               packageStream, publishLicense, cryptoProvider);

                WriteStatus("   Adding an author's UseLicense.");
                RightsManagementInformation rmi =
                    ePackage.RightsManagementInformation;
                rmi.SaveUseLicense(author, authorsUseLicense);

                ePackage.Close();
                WriteStatus("   Done - Package encryption complete.");

                WriteStatus("Verifying package encryption.");
                if (EncryptedPackageEnvelope.IsEncryptedPackageEnvelope(encryptedFile))
                {
                    WriteStatus("   Confirmed - '" + encryptedFilename +
                                "' is encrypted.");
                }
                else
                {
                    MessageBox.Show("ERROR: '" + encryptedFilename +
                                    "' is NOT ENCRYPTED.", "Encryption Error",
                                    MessageBoxButton.OK, MessageBoxImage.Error);
                    WriteStatus("ERROR: '" + encryptedFilename +
                                "' is NOT ENCRYPTED.\n");
                    return(false);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception: " + ex.Message + "\n\n" +
                                ex.GetType().ToString() + "\n\n" + ex.StackTrace,
                                "Runtime Exception",
                                MessageBoxButton.OK, MessageBoxImage.Error);
                return(false);
            }

            WritePrompt("See the RightsManagedPackageViewer sample for details " +
                        "on how to access the content of a rights managed package.");
            return(true);
        }// end:PublishRMPackage()
Exemple #2
0
        }// end:OnPublish()


        // ------------------------ PublishRMPackage --------------------------
        /// <summary>
        ///   Writes an encrypted righted managed package.</summary>
        /// <param name="packageFilepath">
        ///   The path and filename of the source document package.</param>
        /// <param name="filename">
        ///   The path and filename of the XrML rights management file.</param>
        /// <param name="encryptedFilepath">
        ///   The path and filename for writing the RM encrypted package.</param>
        /// <returns>
        ///   true if the encrypted package is written successfully;
        ///   otherwise false.</returns>
        public bool PublishRMPackage(
            string packageFile, string xrmlFile, string encryptedFile)
        {
            string xrmlString;

            // Extract individual filenames without the path.
            string packageFilename   = packageFile.Remove( 0,
                                            packageFile.LastIndexOf('\\')+1 );
            string xrmlFilename      = xrmlFile.Remove( 0,
                                            xrmlFile.LastIndexOf('\\')+1 );
            string encryptedFilename = encryptedFile.Remove( 0,
                                            encryptedFile.LastIndexOf('\\')+1 );

            try
            {
                //<SnippetRmPkgPubUnPubLic>
                WriteStatus("   Reading '" + xrmlFilename + "' permissions.");
                try
                {
                    StreamReader sr = File.OpenText(xrmlFile);
                    xrmlString = sr.ReadToEnd();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("ERROR: '"+xrmlFilename+"' open failed.\n"+
                        "Exception: " + ex.Message, "XrML File Error",
                        MessageBoxButton.OK, MessageBoxImage.Error);
                    return false;
                }

                WriteStatus("   Building UnsignedPublishLicense");
                WriteStatus("       from '" + xrmlFilename + "'.");
                UnsignedPublishLicense unsignedLicense =
                    new UnsignedPublishLicense(xrmlString);
                ContentUser author = unsignedLicense.Owner;
                //</SnippetRmPkgPubUnPubLic>

                //<SnippetRmPkgBldSecEnv>
                WriteStatus("   Building secure environment.");
                try
                {
                    //<SnippetRmPkgPubSecEnv>
                    string applicationManifest = "<manifest></manifest>";
                    if (File.Exists("rpc.xml"))
                    {
                        StreamReader manifestReader = File.OpenText("rpc.xml");
                        applicationManifest = manifestReader.ReadToEnd();
                    }

                    if (_secureEnv == null)
                    {
                        if (SecureEnvironment.IsUserActivated(new ContentUser(
                                    _currentUserId, AuthenticationType.Windows)))
                        {
                            _secureEnv = SecureEnvironment.Create(
                                applicationManifest, new ContentUser(
                                    _currentUserId, AuthenticationType.Windows));
                        }
                        else
                        {
                            _secureEnv = SecureEnvironment.Create(
                                applicationManifest,
                                AuthenticationType.Windows,
                                UserActivationMode.Permanent);
                        }
                    }
                    //</SnippetRmPkgPubSecEnv>
                }
                catch (RightsManagementException ex)
                {
                    MessageBox.Show("ERROR: Failed to build secure environment.\n" +
                        "Exception: " + ex.Message + "\n\n" +
                        ex.FailureCode.ToString() + "\n\n" + ex.StackTrace,
                        "Rights Management Exception",
                        MessageBoxButton.OK, MessageBoxImage.Error);
                    return false;
                }
                //</SnippetRmPkgBldSecEnv>

                // If using Windows authentication and the Xrml owner name
                // does not match the current log-in name, show error message
                if ((author.AuthenticationType == AuthenticationType.Windows)
                    && (author.Name != _currentUserId))
                {
                    MessageBox.Show("ERROR: The current user name does not " +
                        "match the UnsignedPublishLicense owner.\n" +
                        "Please check the owner <NAME> element contained in '" +
                        xrmlFilename + "'\n\n" +
                        "Current user log-in ID: " + _currentUserId + "\n" +
                        "XrML UnsignedPublishLicense owner name: " + author.Name,
                        "Incorrect Authentication Name",
                        MessageBoxButton.OK, MessageBoxImage.Error);
                   return false;
                }

                //<SnippetRmPkgPubEncrypt>
                WriteStatus("   Signing the UnsignedPublishLicense\n" +
                            "       to build the PublishLicense.");
                UseLicense authorsUseLicense;
                PublishLicense publishLicense =
                    unsignedLicense.Sign(_secureEnv, out authorsUseLicense);

                WriteStatus("   Binding the author's UseLicense and");
                WriteStatus("       obtaining the CryptoProvider.");
                CryptoProvider cryptoProvider = authorsUseLicense.Bind(_secureEnv);

                WriteStatus("   Creating the EncryptedPackage.");
                Stream packageStream = File.OpenRead(packageFile);
                EncryptedPackageEnvelope ePackage =
                    EncryptedPackageEnvelope.CreateFromPackage(encryptedFile,
                        packageStream, publishLicense, cryptoProvider);

                WriteStatus("   Adding an author's UseLicense.");
                RightsManagementInformation rmi =
                    ePackage.RightsManagementInformation;
                rmi.SaveUseLicense(author, authorsUseLicense);

                ePackage.Close();
                WriteStatus("   Done - Package encryption complete.");

                WriteStatus("Verifying package encryption.");
                if (EncryptedPackageEnvelope.IsEncryptedPackageEnvelope(encryptedFile))
                {
                    WriteStatus("   Confirmed - '" + encryptedFilename +
                                "' is encrypted.");
                }
                else
                {
                    MessageBox.Show("ERROR: '" + encryptedFilename +
                        "' is NOT ENCRYPTED.", "Encryption Error",
                        MessageBoxButton.OK, MessageBoxImage.Error);
                    WriteStatus("ERROR: '" + encryptedFilename +
                                "' is NOT ENCRYPTED.\n");
                    return false;
                }
                //</SnippetRmPkgPubEncrypt>
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception: " + ex.Message + "\n\n" +
                    ex.GetType().ToString() + "\n\n" + ex.StackTrace,
                    "Runtime Exception",
                    MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }

            WritePrompt("See the RightsManagedPackageViewer sample for details " +
                "on how to access the content of a rights managed package.");
            return true;
        }// end:PublishRMPackage()
Exemple #3
0
        public bool OpenEncryptedDocument(string xpsFile)
        {
            // Check to see if the document is encrypted.
            // If not encrypted, use OpenDocument().
            if (!EncryptedPackageEnvelope.IsEncryptedPackageEnvelope(xpsFile))
                return OpenDocument(xpsFile);

            ShowStatus("Opening encrypted '" + Filename(xpsFile) + "'");

            // Get the ID of the current user log-in.
            string currentUserId;
            try
                { currentUserId = GetDefaultWindowsUserName(); }
            catch
                { currentUserId = null; }
            if (currentUserId == null)
            {
                MessageBox.Show("No valid user ID available", "Invalid User ID",
                    MessageBoxButton.OK, MessageBoxImage.Error);
                ShowStatus("   No valid user ID available.");
                return false;
            }

            ShowStatus("   Current user ID:  '" + currentUserId + "'");
            ShowStatus("   Using " + _authentication + " authentication.");
            ShowStatus("   Checking rights list for user:\n       " +
                           currentUserId);
            ShowStatus("   Initializing the environment.");

            try
            {
                string applicationManifest = "<manifest></manifest>";
                if (File.Exists("rvc.xml"))
                {
                    ShowStatus("   Reading manifest 'rvc.xml'.");
                    StreamReader manifestReader = File.OpenText("rvc.xml");
                    applicationManifest = manifestReader.ReadToEnd();
                }

                ShowStatus("   Initiating SecureEnvironment as user: \n       " +
                    currentUserId + " [" + _authentication + "]");
                if (SecureEnvironment.IsUserActivated(
                    new ContentUser(currentUserId, _authentication)))
                {
                    ShowStatus("   User is already activated.");
                    _secureEnv = SecureEnvironment.Create(applicationManifest,
                                    new ContentUser(currentUserId, _authentication));
                }
                else // if user is not yet activated.
                {
                    ShowStatus("   User is NOT activated,\n       activating now....");
                    // If using the current Windows user, no credentials are
                    // required and we can use UserActivationMode.Permanent.
                    _secureEnv = SecureEnvironment.Create(applicationManifest,
                                    _authentication, UserActivationMode.Permanent);

                    // If not using the current Windows user, use
                    // UserActivationMode.Temporary to display the Windows
                    // credentials pop-up window.
                    ///_secureEnv = SecureEnvironment.Create(applicationManifest,
                    ///     a_authentication, UserActivationMode.Temporary);
                }
                ShowStatus("   Created SecureEnvironment for user:\n       " +
                    _secureEnv.User.Name +
                    " [" + _secureEnv.User.AuthenticationType + "]");

                ShowStatus("   Opening the encrypted Package.");
                EncryptedPackageEnvelope ePackage =
                    EncryptedPackageEnvelope.Open(xpsFile, FileAccess.ReadWrite);
                RightsManagementInformation rmi =
                    ePackage.RightsManagementInformation;

                ShowStatus("   Looking for an embedded UseLicense for user:\n       " +
                           currentUserId + " [" + _authentication + "]");
                UseLicense useLicense =
                    rmi.LoadUseLicense(
                        new ContentUser(currentUserId, _authentication));

                ReadOnlyCollection<ContentGrant> grants;
                if (useLicense == null)
                {
                    ShowStatus("   No Embedded UseLicense found.\n       " +
                               "Attempting to acqure UseLicnese\n       " +
                               "from the PublishLicense.");
                    PublishLicense pubLicense = rmi.LoadPublishLicense();

                    ShowStatus("   Referral information:");

                    if (pubLicense.ReferralInfoName == null)
                        ShowStatus("       Name: (null)");
                    else
                        ShowStatus("       Name: " + pubLicense.ReferralInfoName);

                    if (pubLicense.ReferralInfoUri == null)
                        ShowStatus("    Uri: (null)");
                    else
                        ShowStatus("    Uri: " +
                            pubLicense.ReferralInfoUri.ToString());

                    useLicense = pubLicense.AcquireUseLicense(_secureEnv);
                    if (useLicense == null)
                    {
                        ShowStatus("   User DOES NOT HAVE RIGHTS\n       " +
                            "to access this document!");
                        return false;
                    }
                }// end:if (useLicense == null)
                ShowStatus("   UseLicense acquired.");

                ShowStatus("   Binding UseLicense with the SecureEnvironment" +
                         "\n       to obtain the CryptoProvider.");
                rmi.CryptoProvider = useLicense.Bind(_secureEnv);

                ShowStatus("   Obtaining BoundGrants.");
                grants = rmi.CryptoProvider.BoundGrants;

                // You can access the Package via GetPackage() at this point.

                rightsBlock.Text = "GRANTS LIST\n-----------\n";
                foreach (ContentGrant grant in grants)
                {
                    rightsBlock.Text += "USER  :"******" [" +
                        grant.User.AuthenticationType + "]\n";
                    rightsBlock.Text += "RIGHT :" + grant.Right.ToString()+"\n";
                    rightsBlock.Text += "    From:  " + grant.ValidFrom + "\n";
                    rightsBlock.Text += "    Until: " + grant.ValidUntil + "\n";
                }

                if (rmi.CryptoProvider.CanDecrypt == true)
                    ShowStatus("   Decryption granted.");
                else
                    ShowStatus("   CANNOT DECRYPT!");

                ShowStatus("   Getting the Package from\n" +
                           "      the EncryptedPackage.");
                _xpsPackage = ePackage.GetPackage();
                if (_xpsPackage == null)
                {
                    MessageBox.Show("Unable to get Package.");
                    return false;
                }

                // Set a PackageStore Uri reference for the encrypted stream.
                // ("sdk://packLocation" is a pseudo URI used by
                //  PackUriHelper.Create to define the parserContext.BaseURI
                //  that XamlReader uses to access the encrypted data stream.)
                Uri packageUri = new Uri(@"sdk://packLocation", UriKind.Absolute);
                // Add the URI package
                PackageStore.AddPackage(packageUri, _xpsPackage);
                // Determine the starting part for the package.
                PackagePart startingPart = GetPackageStartingPart(_xpsPackage);

                // Set the DocViewer.Document property.
                ShowStatus("   Opening in DocumentViewer.");
                ParserContext parserContext = new ParserContext();
                parserContext.BaseUri = PackUriHelper.Create(
                                            packageUri, startingPart.Uri);
                parserContext.XamlTypeMapper = XamlTypeMapper.DefaultMapper;
                DocViewer.Document = XamlReader.Load(
                    startingPart.GetStream(), parserContext)
                        as IDocumentPaginatorSource;

                // Enable document menu controls.
                menuFileClose.IsEnabled = true;
                menuFilePrint.IsEnabled = true;
                menuViewIncreaseZoom.IsEnabled = true;
                menuViewDecreaseZoom.IsEnabled = true;

                // Give the DocumentViewer focus.
                DocViewer.Focus();
            }// end:try
            catch (Exception ex)
            {
                MessageBox.Show("Exception: " + ex.Message + "\n\n" +
                    ex.GetType().ToString() + "\n\n" + ex.StackTrace,
                    "Exception",
                    MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }

            this.Title = "RightsManagedPackageViewer SDK Sample - " +
                         Filename(xpsFile) + " (encrypted)";
            return true;
        }// end:OpenEncryptedDocument()