sfx2/source/dialog/mailmodel.cxx | 11 +++- shell/source/cmdmail/cmdmailsuppl.cxx | 93 ++++++++++++++++++++++++---------- 2 files changed, 76 insertions(+), 28 deletions(-)
New commits: commit 5c8a3bfc7e42009a7eaa6353cf2f66a14bfdab76 Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Feb 10 11:23:09 2014 +0100 Don't call pclose(NULL) Change-Id: I6540ec2b900e82745d5e661dfa920f85db6c0ff2 diff --git a/shell/source/cmdmail/cmdmailsuppl.cxx b/shell/source/cmdmail/cmdmailsuppl.cxx index 7730f05..7f40594 100644 --- a/shell/source/cmdmail/cmdmailsuppl.cxx +++ b/shell/source/cmdmail/cmdmailsuppl.cxx @@ -301,7 +301,8 @@ void SAL_CALL CmdMailSuppl::sendSimpleMailMessage( const Reference< XSimpleMailM } OString cmd = aBuffer.makeStringAndClear(); - if ( 0 != pclose(popen(cmd.getStr(), "w")) ) + FILE * f = popen(cmd.getStr(), "w"); + if (f == 0 || pclose(f) != 0) { throw ::com::sun::star::uno::Exception("No mail client configured", static_cast < XSimpleMailClient * > (this) ); commit f669e7907bef8585fd182986c708e2e4aed280aa Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Feb 10 11:20:12 2014 +0100 Properly encode cmd line for popen Change-Id: I1f7799920b6732a6cd128143dfa7ce282bad25c6 diff --git a/shell/source/cmdmail/cmdmailsuppl.cxx b/shell/source/cmdmail/cmdmailsuppl.cxx index 5b1b403..7730f05 100644 --- a/shell/source/cmdmail/cmdmailsuppl.cxx +++ b/shell/source/cmdmail/cmdmailsuppl.cxx @@ -109,6 +109,47 @@ Reference< XSimpleMailMessage > SAL_CALL CmdMailSuppl::createSimpleMailMessage( // XSimpleMailClient //------------------------------------------------ +namespace { + +void appendShellWord(OStringBuffer & buffer, OUString const & word, bool strict) +{ + OString sys; + if (!word.convertToString( + &sys, osl_getThreadTextEncoding(), + (strict + ? (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR + | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR) + : OUSTRING_TO_OSTRING_CVTFLAGS))) + { + throw css::uno::Exception( + ("Could not convert \"" + word + "\" to encoding #" + + OUString::number(osl_getThreadTextEncoding())), + css::uno::Reference<css::uno::XInterface>()); + } + buffer.append('\''); + for (sal_Int32 i = 0; i != sys.getLength(); ++i) { + char c = sys[i]; + switch (c) { + case 0: + if (strict) { + throw css::uno::Exception( + "Could not convert word containing NUL, \"" + word + "\"", + css::uno::Reference<css::uno::XInterface>()); + } + break; + case '\'': + buffer.append("'\\''"); + break; + default: + buffer.append(c); + break; + } + } + buffer.append('\''); +} + +} + void SAL_CALL CmdMailSuppl::sendSimpleMailMessage( const Reference< XSimpleMailMessage >& xSimpleMailMessage, sal_Int32 /*aFlag*/ ) throw (IllegalArgumentException, Exception, RuntimeException) { @@ -135,7 +176,8 @@ void SAL_CALL CmdMailSuppl::sendSimpleMailMessage( const Reference< XSimpleMailM static_cast < XSimpleMailClient * > (this)); } - OStringBuffer aBuffer("\"" + OUStringToOString(aProgram, osl_getThreadTextEncoding()) + "\" "); + OStringBuffer aBuffer; + appendShellWord(aBuffer, aProgram, true); try { @@ -171,12 +213,12 @@ void SAL_CALL CmdMailSuppl::sendSimpleMailMessage( const Reference< XSimpleMailM // make sure we have a system path FileBase::getSystemPathFromFileURL( aMailer, aMailer ); - aBuffer.append("--mailclient " + OUStringToOString( aMailer, osl_getThreadTextEncoding() ) + - " "); + aBuffer.append(" --mailclient "); + appendShellWord(aBuffer, aMailer, true); } #ifdef MACOSX else - aBuffer.append("--mailclient Mail "); + aBuffer.append(" --mailclient Mail"); #endif } @@ -196,26 +238,28 @@ void SAL_CALL CmdMailSuppl::sendSimpleMailMessage( const Reference< XSimpleMailM rtl::OUString sBody = xMessage->getBody(); if ( sBody.getLength() > 0 ) { - aBuffer.append("--body \""); - aBuffer.append(OUStringToOString(sBody, osl_getThreadTextEncoding())); - aBuffer.append("\" "); + aBuffer.append(" --body "); + appendShellWord(aBuffer, sBody, false); } } + // Convert from, to, etc. in a best-effort rather than a strict way to the + // system encoding, based on the assumption that the relevant address parts + // of those strings are ASCII anyway and any problematic characters are only + // in the human-readable, informational-only parts: + // Append originator if set in the message if ( !xSimpleMailMessage->getOriginator().isEmpty() ) { - aBuffer.append("--from \"" + - OUStringToOString(xSimpleMailMessage->getOriginator(), osl_getThreadTextEncoding()) + - "\" "); + aBuffer.append(" --from "); + appendShellWord(aBuffer, xSimpleMailMessage->getOriginator(), false); } // Append receipient if set in the message if ( !xSimpleMailMessage->getRecipient().isEmpty() ) { - aBuffer.append("--to \"" + - OUStringToOString(xSimpleMailMessage->getRecipient(), osl_getThreadTextEncoding()) + - "\" "); + aBuffer.append(" --to "); + appendShellWord(aBuffer, xSimpleMailMessage->getRecipient(), false); } // Append carbon copy receipients set in the message @@ -223,9 +267,8 @@ void SAL_CALL CmdMailSuppl::sendSimpleMailMessage( const Reference< XSimpleMailM sal_Int32 n, nmax = aStringList.getLength(); for ( n = 0; n < nmax; n++ ) { - aBuffer.append("--cc \"" + - OUStringToOString(aStringList[n], osl_getThreadTextEncoding()) + - "\" "); + aBuffer.append(" --cc "); + appendShellWord(aBuffer, aStringList[n], false); } // Append blind carbon copy receipients set in the message @@ -233,17 +276,15 @@ void SAL_CALL CmdMailSuppl::sendSimpleMailMessage( const Reference< XSimpleMailM nmax = aStringList.getLength(); for ( n = 0; n < nmax; n++ ) { - aBuffer.append("--bcc \"" + - OUStringToOString(aStringList[n], osl_getThreadTextEncoding()) + - "\" "); + aBuffer.append(" --bcc "); + appendShellWord(aBuffer, aStringList[n], false); } // Append subject if set in the message if ( !xSimpleMailMessage->getSubject().isEmpty() ) { - aBuffer.append("--subject \"" + - OUStringToOString(xSimpleMailMessage->getSubject(), osl_getThreadTextEncoding()) + - "\" "); + aBuffer.append(" --subject "); + appendShellWord(aBuffer, xSimpleMailMessage->getSubject(), false); } // Append attachments set in the message @@ -254,9 +295,8 @@ void SAL_CALL CmdMailSuppl::sendSimpleMailMessage( const Reference< XSimpleMailM OUString aSystemPath; if ( FileBase::E_None == FileBase::getSystemPathFromFileURL(aStringList[n], aSystemPath) ) { - aBuffer.append("--attach \"" + - OUStringToOString(aSystemPath, osl_getThreadTextEncoding()) + - "\" "); + aBuffer.append(" --attach "); + appendShellWord(aBuffer, aSystemPath, true); } } commit 740fe0ce142c521d3a75558dea6535017821e127 Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Feb 10 11:18:33 2014 +0100 Resolves: rhbz#1063170 Don't URI-encode filename in e-mail subject Change-Id: I7e3f59af5bb7d89c74e2bf199a727b2419714121 diff --git a/sfx2/source/dialog/mailmodel.cxx b/sfx2/source/dialog/mailmodel.cxx index 8e2110a..0efcebc 100644 --- a/sfx2/source/dialog/mailmodel.cxx +++ b/sfx2/source/dialog/mailmodel.cxx @@ -849,8 +849,15 @@ SfxMailModel::SendMailResult SfxMailModel::Send( const css::uno::Reference< css: Sequence< OUString > aAttachmentSeq(&(maAttachedDocuments[0]),maAttachedDocuments.size()); if ( xSimpleMailMessage->getSubject().isEmpty() ) { - OUString baseName( maAttachedDocuments[0].copy( maAttachedDocuments[0].lastIndexOf( '/' ) + 1 ) ); - OUString subject( baseName ); + INetURLObject url( + maAttachedDocuments[0], INetURLObject::WAS_ENCODED); + OUString subject( + url.getName( + INetURLObject::LAST_SEGMENT, false, + INetURLObject::DECODE_WITH_CHARSET)); + if (subject.isEmpty()) { + subject = maAttachedDocuments[0]; + } if ( maAttachedDocuments.size() > 1 ) subject += ", ..."; xSimpleMailMessage->setSubject( subject ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits