diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2014-02-10 11:20:12 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2014-02-10 11:23:45 +0100 |
commit | f669e7907bef8585fd182986c708e2e4aed280aa (patch) | |
tree | a3ee3cf861893a386886bc230517b48a62128721 /shell | |
parent | 740fe0ce142c521d3a75558dea6535017821e127 (diff) |
Properly encode cmd line for popen
Change-Id: I1f7799920b6732a6cd128143dfa7ce282bad25c6
Diffstat (limited to 'shell')
-rw-r--r-- | shell/source/cmdmail/cmdmailsuppl.cxx | 90 |
1 files changed, 65 insertions, 25 deletions
diff --git a/shell/source/cmdmail/cmdmailsuppl.cxx b/shell/source/cmdmail/cmdmailsuppl.cxx index 5b1b403cd0ec..7730f050faff 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); } } |