summaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2014-02-10 11:20:12 +0100
committerStephan Bergmann <sbergman@redhat.com>2014-02-10 11:23:45 +0100
commitf669e7907bef8585fd182986c708e2e4aed280aa (patch)
treea3ee3cf861893a386886bc230517b48a62128721 /shell
parent740fe0ce142c521d3a75558dea6535017821e127 (diff)
Properly encode cmd line for popen
Change-Id: I1f7799920b6732a6cd128143dfa7ce282bad25c6
Diffstat (limited to 'shell')
-rw-r--r--shell/source/cmdmail/cmdmailsuppl.cxx90
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);
}
}