[Libreoffice-commits] core.git: sfx2/source

Oliver-Rainer Wittmann orw at apache.org
Thu May 2 04:09:54 PDT 2013


 sfx2/source/doc/objstor.cxx      |    3 +
 sfx2/source/doc/sfxbasemodel.cxx |   72 ++++++++++++++++++++++-----------------
 2 files changed, 45 insertions(+), 30 deletions(-)

New commits:
commit cdfad2dbbf180d3c556964c7aa8e0bb3b299d5e3
Author: Oliver-Rainer Wittmann <orw at apache.org>
Date:   Tue Jun 26 13:48:58 2012 +0000

    Resolves: #i119366# ensure password can be removed via "Save As..."
    
    Found by: DonJaime <donjaime at freenet dot de>
    Patch by: zhengfan <zheng.easyfan at gmail dot com>
    Review by: Oliver <orw at apache dot org>
    (cherry picked from commit 9957730bb807c6d81f243e14a19cbb6a91035194)
    
    Conflicts:
    	sfx2/source/doc/sfxbasemodel.cxx
    
    Change-Id: I93bfdd7f32671171f1b219f9fd2dbeac30a92254

diff --git a/sfx2/source/doc/objstor.cxx b/sfx2/source/doc/objstor.cxx
index b92a10a..c57c79a 100644
--- a/sfx2/source/doc/objstor.cxx
+++ b/sfx2/source/doc/objstor.cxx
@@ -2749,6 +2749,9 @@ sal_Bool SfxObjectShell::PreDoSaveAs_Impl
     // in "SaveAs" title and password will be cleared ( maybe the new itemset contains new values, otherwise they will be empty )
     pMergedParams->ClearItem( SID_ENCRYPTIONDATA );
     pMergedParams->ClearItem( SID_PASSWORD );
+    // #i119366# - As the SID_ENCRYPTIONDATA and SID_PASSWORD are using for setting password together, we need to clear them both.
+    // Also, ( maybe the new itemset contains new values, otherwise they will be empty )
+    pMergedParams->ClearItem( SID_ENCRYPTIONDATA );
     pMergedParams->ClearItem( SID_DOCINFO_TITLE );
 
     pMergedParams->ClearItem( SID_INPUTSTREAM );
diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx
index 90fe7e5..d5d5814 100644
--- a/sfx2/source/doc/sfxbasemodel.cxx
+++ b/sfx2/source/doc/sfxbasemodel.cxx
@@ -2950,45 +2950,57 @@ void SfxBaseModel::impl_store(  const   OUString&                   sURL
                 const SfxFilter* pFilter = pMedium->GetFilter();
                 if ( pFilter && aFilterName.equals( pFilter->GetFilterName() ) )
                 {
-                    aArgHash.erase( aFilterString );
-                    aArgHash.erase( OUString( "URL"  ) );
-
-                    try
+                    // #i119366# - If the former file saving with password, do not trying in StoreSelf anyway...
+                    bool bFormerPassword = false;
                     {
-                        storeSelf( aArgHash.getAsConstPropertyValueList() );
-                        bSaved = sal_True;
+                        uno::Sequence< beans::NamedValue > aOldEncryptionData;
+                        if (GetEncryptionData_Impl( pMedium->GetItemSet(), aOldEncryptionData ))
+                        {
+                            bFormerPassword = true;
+                        }
                     }
-                    catch( const lang::IllegalArgumentException& )
+                    if ( !bFormerPassword )
                     {
-#if HAVE_FEATURE_MULTIUSER_ENVIRONMENT
-                        // some additional arguments do not allow to use saving, SaveAs should be done
-                        // but only for normal documents, the shared documents would be overwritten in this case
-                        // that would mean an information loss
-                        // TODO/LATER: need a new interaction for this case
-                        if ( m_pData->m_pObjectShell->IsDocShared() )
-                        {
-                            m_pData->m_pObjectShell->AddLog( OUString( OSL_LOG_PREFIX "Can't store shared document!"  ) );
-                            m_pData->m_pObjectShell->StoreLog();
+                        aArgHash.erase( aFilterString );
+                        aArgHash.erase( OUString( "URL" ) );
 
-                            Sequence< beans::NamedValue > aNewEncryptionData = aArgHash.getUnpackedValueOrDefault( OUString( "EncryptionData"  ), Sequence< beans::NamedValue >() );
-                            if ( !aNewEncryptionData.getLength() )
+                        try
+                        {
+                            storeSelf( aArgHash.getAsConstPropertyValueList() );
+                            bSaved = sal_True;
+                        }
+                        catch( const lang::IllegalArgumentException& )
+                        {
+#if HAVE_FEATURE_MULTIUSER_ENVIRONMENT
+                            // some additional arguments do not allow to use saving, SaveAs should be done
+                            // but only for normal documents, the shared documents would be overwritten in this case
+                            // that would mean an information loss
+                            // TODO/LATER: need a new interaction for this case
+                            if ( m_pData->m_pObjectShell->IsDocShared() )
                             {
-                                OUString aNewPassword = aArgHash.getUnpackedValueOrDefault( OUString( "Password"  ), OUString() );
-                                aNewEncryptionData = ::comphelper::OStorageHelper::CreatePackageEncryptionData( aNewPassword );
-                            }
+                                m_pData->m_pObjectShell->AddLog( OUString( OSL_LOG_PREFIX "Can't store shared document!" ) );
+                                m_pData->m_pObjectShell->StoreLog();
 
-                            Sequence< beans::NamedValue > aOldEncryptionData;
-                            GetEncryptionData_Impl( pMedium->GetItemSet(), aOldEncryptionData );
+                                uno::Sequence< beans::NamedValue > aNewEncryptionData = aArgHash.getUnpackedValueOrDefault( OUString( "EncryptionData" ), uno::Sequence< beans::NamedValue >() );
+                                if ( !aNewEncryptionData.getLength() )
+                                {
+                                    OUString aNewPassword = aArgHash.getUnpackedValueOrDefault( OUString( "Password" ), OUString() );
+                                    aNewEncryptionData = ::comphelper::OStorageHelper::CreatePackageEncryptionData( aNewPassword );
+                                }
 
-                            if ( !aOldEncryptionData.getLength() && !aNewEncryptionData.getLength() )
-                                throw;
-                            else
-                            {
-                                // if the password is changed a special error should be used in case of shared document
-                                throw task::ErrorCodeIOException( OUString( "Cant change password for shared document."  ), Reference< XInterface >(), ERRCODE_SFX_SHARED_NOPASSWORDCHANGE );
+                                uno::Sequence< beans::NamedValue > aOldEncryptionData;
+                                GetEncryptionData_Impl( pMedium->GetItemSet(), aOldEncryptionData );
+
+                                if ( !aOldEncryptionData.getLength() && !aNewEncryptionData.getLength() )
+                                    throw;
+                                else
+                                {
+                                    // if the password is changed a special error should be used in case of shared document
+                                    throw task::ErrorCodeIOException( OUString( "Cant change password for shared document." ), uno::Reference< uno::XInterface >(), ERRCODE_SFX_SHARED_NOPASSWORDCHANGE );
+                                }
                             }
-                        }
 #endif
+                        }
                     }
                 }
             }


More information about the Libreoffice-commits mailing list