File libreoffice-doc-as-mail-bnc900218.patch of Package libreoffice.openSUSE_13.1_Update
diff -urN libreoffice-4.1.6.2.old/shell/source/cmdmail/cmdmailsuppl.cxx libreoffice-4.1.6.2/shell/source/cmdmail/cmdmailsuppl.cxx
--- libreoffice-4.1.6.2.old/shell/source/cmdmail/cmdmailsuppl.cxx 2014-11-04 12:51:24.517395420 +0100
+++ libreoffice-4.1.6.2/shell/source/cmdmail/cmdmailsuppl.cxx 2014-11-04 12:55:57.725583898 +0100
@@ -105,6 +105,47 @@
// 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::valueOf(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)
{
@@ -131,7 +172,8 @@
static_cast < XSimpleMailClient * > (this));
}
- OStringBuffer aBuffer("\"" + OUStringToOString(aProgram, osl_getThreadTextEncoding()) + "\" ");
+ OStringBuffer aBuffer;
+ appendShellWord(aBuffer, aProgram, true);
try
{
@@ -167,12 +209,13 @@
// 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
}
@@ -186,20 +229,23 @@
throw;
}
+ // 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
@@ -207,9 +253,8 @@
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
@@ -217,17 +262,15 @@
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
@@ -238,9 +281,8 @@
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);
}
}