diff options
author | Julien Nabet <serval2412@yahoo.fr> | 2018-10-09 22:22:35 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-10-11 09:17:35 +0200 |
commit | c52b50a43908b22dde25cfca674001f670948c07 (patch) | |
tree | 8ddcc9dc8064317f332cffd9f6f2787edd785575 | |
parent | 3f7ad9cd3baeb2360164fd0d82a325c311e5a42f (diff) |
tdf#120158: fix ImplGetParameterString for typename
since type name might also contain unacceptable characters,
encode all of them
See comments 8/9/10 and 11 (bt here) of bugtracker
+ add SAL_WARN in catch (which would have avoided me to waste a lot of
time chasing the root cause)
Change-Id: If8555bba8cda011218206621216e0405615229eb
Reviewed-on: https://gerrit.libreoffice.org/61601
Tested-by: Jenkins
Reviewed-by: Julien Nabet <serval2412@yahoo.fr>
(cherry picked from commit 40e22f1e1bd44a1aa56ff77b82f1306ed1076ebf)
Reviewed-on: https://gerrit.libreoffice.org/61636
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | svtools/source/misc/transfer.cxx | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/svtools/source/misc/transfer.cxx b/svtools/source/misc/transfer.cxx index 7f6d83dee5a7..0cebe63fb051 100644 --- a/svtools/source/misc/transfer.cxx +++ b/svtools/source/misc/transfer.cxx @@ -103,6 +103,25 @@ SvStream& WriteTransferableObjectDescriptor( SvStream& rOStm, const Transferable return rOStm; } +// Clean OUString given in parameter +// by returning an other OUString containing only authorized chars +static OUString lcl_getAuthorizedCharsString(const OUString& rInputString) +{ + sal_Bool pToAccept[128]; + for (sal_Bool & rb : pToAccept) + rb = false; + + const char aQuotedParamChars[] = + "()<>@,;:/[]?=!#$&'*+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~. "; + + for ( sal_Int32 nInd = 0; nInd < RTL_CONSTASCII_LENGTH(aQuotedParamChars); ++nInd ) + { + sal_Unicode nChar = aQuotedParamChars[nInd]; + if ( nChar < 128 ) + pToAccept[nChar] = true; + } + return rtl::Uri::encode(rInputString, pToAccept, rtl_UriEncodeIgnoreEscapes, RTL_TEXTENCODING_UTF8); +} // the reading of the parameter is done using the special service css::datatransfer::MimeContentType, // a similar approach should be implemented for creation of the mimetype string; @@ -120,32 +139,14 @@ static OUString ImplGetParameterString( const TransferableObjectDescriptor& rObj if( !rObjDesc.maTypeName.isEmpty() ) { - aParams += ";typename=\"" + rObjDesc.maTypeName + "\""; + // the type name might contain unacceptable characters, encode all of them + aParams += ";typename=\"" + lcl_getAuthorizedCharsString(rObjDesc.maTypeName) + "\""; } if( !rObjDesc.maDisplayName.isEmpty() ) { // the display name might contain unacceptable characters, encode all of them - // this seems to be the only parameter currently that might contain such characters - sal_Bool pToAccept[128]; - for (sal_Bool & rb : pToAccept) - rb = false; - - const char aQuotedParamChars[] = - "()<>@,;:/[]?=!#$&'*+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~. "; - - for ( sal_Int32 nInd = 0; nInd < RTL_CONSTASCII_LENGTH(aQuotedParamChars); ++nInd ) - { - sal_Unicode nChar = aQuotedParamChars[nInd]; - if ( nChar < 128 ) - pToAccept[nChar] = true; - } - - aParams += ";displayname=\"" - + rtl::Uri::encode( - rObjDesc.maDisplayName, pToAccept, rtl_UriEncodeIgnoreEscapes, - RTL_TEXTENCODING_UTF8) - + "\""; + aParams += ";displayname=\"" + lcl_getAuthorizedCharsString(rObjDesc.maDisplayName) + "\""; } aParams += ";viewaspect=\"" + OUString::number(rObjDesc.mnViewAspect) @@ -186,7 +187,7 @@ static void ImplSetParameterString( TransferableObjectDescriptor& rObjDesc, cons if( xMimeType->hasParameter( aTypeNameString ) ) { - rObjDesc.maTypeName = xMimeType->getParameterValue( aTypeNameString ); + rObjDesc.maTypeName = ::rtl::Uri::decode( xMimeType->getParameterValue( aTypeNameString ), rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 ); } if( xMimeType->hasParameter( aDisplayNameString ) ) @@ -1213,8 +1214,9 @@ void TransferableDataHelper::FillDataFlavorExVector( const Sequence< DataFlavor if( !rFlavor.MimeType.isEmpty() ) xMimeType = xMimeFact->createMimeContentType( rFlavor.MimeType ); } - catch( const css::uno::Exception& ) + catch( const css::uno::Exception& e) { + SAL_WARN("svtools.misc", "Something went wrong with calling to createMimeContentType: \"" << e << "\""); } aFlavorEx.MimeType = rFlavor.MimeType; |