Bug 93703 - Problem parsing to, cc fields
Summary: Problem parsing to, cc fields
Status: RESOLVED WORKSFORME
Alias: None
Product: kmail
Classification: Applications
Component: general (show other bugs)
Version: 1.7.1
Platform: unspecified Solaris
: NOR normal
Target Milestone: ---
Assignee: kdepim bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2004-11-22 06:37 UTC by Devendra Deshpande
Modified: 2009-08-30 22:09 UTC (History)
1 user (show)

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Devendra Deshpande 2004-11-22 06:37:49 UTC
Version:           1.7.1 (using KDE 3.3.1, compiled sources)
Compiler:          gcc version 3.2.3
OS:                SunOS (sun4u) release 5.8

Hi,

There are several problems with the parsing:

1. Cannot parse addresses that do NOT have @domain.com

   I have messages that have entries like:

   To: ind_tecci
   Cc: mitra

   These to/cc entries do NOT show up in the message viewer at all.

   When I try to reply, the composer window has no addresses :-(

2. The second I think is related to first: when such entries are on
   multiple lines, some of them appear in the message viewer, others
   do not. Again, replying does not get any of them in the composer.

This is a rather severely limiting problem :-(

I can code quite well. If somebody can point me to the place where the
parsing needs to be fixed (eg is it kmmessage.cpp or is it email.cpp
in libkdepim), I'll really appreciate it ...

Thanks,
Devendra
Comment 1 Matt Douhan 2005-02-18 19:37:54 UTC
how did you manage to recieve an email without a domain part? or am I missing something obvious here?

Comment 2 Devendra Deshpande 2005-02-18 19:53:55 UTC
> ------- Additional Comments From matt fruitsalad org  2005-02-18 19:37
> ------- how did you manage to recieve an email without a domain part?
> or am I missing something obvious here?

No, these are internal emails. And I suppose there's a sendmail option
to strip out the common domain. So I can send an email to <devendra> and
it will reach me perfectly ok. Moreover, I see it as <devendra> and not
devendra@localhost or anything like that.

Please note that a lot of early emailers (like sun's mailtool) simply
sent all the fields to sendmail, without adding the localhost or the
default domain like Kmail or mozilla does.

And I happen to have archives going back to 1996 :-)

Thanks,
Devendra

Comment 3 Matt Douhan 2005-02-20 14:24:44 UTC
CVS commit by mdouhan: 

Parse and validate the email addresses in the to, cc and bcc fields
this means that it is not so easy to mistype an email address and
thus causing strange errors, for example unbalanced > are not allowed
and many other cases are also caught by this validation.

BUG:95183
BUG:29571
BUG:93703
BUG:71680
BUG:74032
BUG:79169


  M +37 -0     kmcomposewin.cpp   1.921
  M +21 -0     kmmessage.cpp   1.518
  M +14 -0     kmmessage.h   1.179


--- kdepim/kmail/kmmessage.h  #1.178:1.179
@@ -16,4 +16,6 @@
 #include <kmime_mdn.h>
 
+#include<libemailfunctions/email.h>
+
 template <typename T>
 class QValueList;
@@ -378,4 +380,16 @@ public:
 
   /**
+    Validate a list of email addresses, and also allow
+    aliases and distribution lists to be expanded
+    before validation.
+    Returns the broken address in question.
+    FIXME: this should be in libemailfucntions but that
+           requires moving expandAliases and all that
+           it brings
+  */
+  static KPIM::EmailParseResult isValidEmailAddressList( const QString& aStr,
+                                                         QString& brokenAddress );
+
+  /**
     Get a hash of the subject.
     Used for threading.

--- kdepim/kmail/kmmessage.cpp  #1.517:1.518
@@ -242,4 +242,25 @@ void KMMessage::setUnencryptedMsg( KMMes
 
 //-----------------------------------------------------------------------------
+//FMD
+//FIXME: move to libemailfunctions
+KPIM::EmailParseResult KMMessage::isValidEmailAddressList( const QString& aStr,
+                                                           QString& brokenAddress ) 
+{
+  if ( aStr.isEmpty() ) {
+     return KPIM::AddressEmpty;
+  }
+
+  QStringList list = KPIM::splitEmailAddrList( aStr );
+  for( QStringList::const_iterator it = list.begin(); it != list.end(); ++it ) {
+    KPIM::EmailParseResult errorCode = KPIM::isValidEmailAddress( *it );
+      if ( errorCode != KPIM::AddressOk ) {
+      brokenAddress = ( *it );
+      return errorCode;
+    }
+  }
+  return KPIM::AddressOk;
+}
+
+//-----------------------------------------------------------------------------
 const DwString& KMMessage::asDwString() const
 {

--- kdepim/kmail/kmcomposewin.cpp  #1.920:1.921
@@ -3559,4 +3559,41 @@ void KMComposeWin::doSend(int aSendNow, 
     }
 
+    // Validate the To:, CC: and BCC fields
+    if ( !to().isEmpty() ) {
+      QString brokenAddress;
+      KPIM::EmailParseResult errorCode = KMMessage::isValidEmailAddressList( KMMessage::expandAliases( to()), brokenAddress );
+      if ( errorCode != KPIM::AddressOk ) {
+        QString errorMsg( "<qt><p><b>" + brokenAddress + 
+                          "</b></p><p>" + KPIM::emailParseResultToString( errorCode ) +
+                          "</p></qt>" );
+        KMessageBox::sorry( this, errorMsg, i18n("Invalid Email Address") );
+        return;
+      }
+    }
+
+    if ( !cc().isEmpty() ) {
+      QString brokenAddress;
+      KPIM::EmailParseResult errorCode = KMMessage::isValidEmailAddressList( KMMessage::expandAliases( cc()), brokenAddress);
+      if ( errorCode != KPIM::AddressOk ) {
+        QString errorMsg( "<qt><p><b>" + brokenAddress +
+                          "</b></p><p>" + KPIM::emailParseResultToString( errorCode ) +
+                          "</p></qt>" );
+        KMessageBox::sorry( this, errorMsg, i18n("Invalid Email Address") );
+        return;
+      }
+    }
+ 
+    if ( !bcc().isEmpty() ) {
+      QString brokenAddress;
+      KPIM::EmailParseResult errorCode = KMMessage::isValidEmailAddressList( KMMessage::expandAliases( bcc()), brokenAddress);
+        if ( errorCode != KPIM::AddressOk ) {
+          QString errorMsg( "<qt><p><b>" + brokenAddress +
+                          "</b></p><p>" + KPIM::emailParseResultToString( errorCode ) +
+                          "</p></qt>" );
+        KMessageBox::sorry( this, errorMsg, i18n("Invalid Email Address") );
+        return;
+      }
+    }
+
     if (subject().isEmpty())
     {


Comment 4 Devendra Deshpande 2005-02-22 12:26:57 UTC
On 20 Feb 2005 13:24:55 -0000 Matt Douhan <matt@fruitsalad.org> wrote:

> [ S N I P P E D the patch ]

I tried back porting the patch to KDE 3.3.2, and it doesn't seem to work
there. My messages, with addresses split over lines, not containing any
<>, are still not parsed properly.

Or is that the patch works only on head?

Thanks,
Devendra

Comment 5 Matt Douhan 2005-02-22 14:17:17 UTC
My apologies, closing this bug was a mistake, I am reopening it again.
Comment 6 Martin Koller 2009-08-30 22:09:40 UTC
works in KDE 4.3