Hi all,

as I promised a while ago, I finally prepared a /very/ first patch implementing 
the replacement of the libesmtp library by GIO for SMTP.

Unfortunately, the patch is so big that I cannot send it by mail; please load it from 
<http://www.mynetcologne.de/~nc-dreszal/balsa-smtp-gio.tar.bz2>.  After unpacking, you 
can verify the contents by running "gpg2 --verify balsa-smtp-gio.diff.asc 
balsa-smtp-gio.diff".

Basically, the patch is divided into two bigger parts: a new library in the 
folder libnetclient, and all the changes to the Balsa code.


(1) libnetclient
================

This library consists of a base class (libnetclient/net-client.[hc]), a derived 
class for the SMTP client (libnetclient/net-client-smtp.[hc]) and a few common 
helper functions (libnetclient/net-client-utils.[hc]).  The sub-folder 
libnetclient/test contains a full unit test environment.  Please see the file 
libnetclient/README for more details.  Additionally, a Makefile template 
(libnetclient/Makefile.am) and a Doxygen control file 
(libnetclient/libnetclient.dox) for building the API docs are included.

Please note that you need to add extra options to configure as to check for the 
testing and documentation requirements, respectively:

<snip>
  --with-libnetclient-docs   Check requirements for building the libnetclient 
API docs (see libnetclient/README; default=no)
  --with-libnetclient-test   Check requirements for running libnetclient tests 
(see libnetclient/README; default=no)
</snip>

Please note also that libnetclient creates a dependency against gnutls, as gio 
also depends on it.


(2) Balsa changes
=================

Basically, in the balsa source code I removed everything which depends on ENABLE_ESMTP being unset 
(i.e. calling sendmail directly).  In the "old" libesmtp code, I replaced everything by 
calling the new library.  The result looks more or less like the "old" code with libesmtp 
being enabled, with the exception of libbalsa/send.c which contains most of the changes, and as a 
result shrunk significantly.  The coding style of that file is a mess, btw., and I must admit that 
my changes do not improve it, shame on me!  I hope we can use uncrustify in the future to fix it...

A special issue is the functionality of libesmtp to remove certain headers.  As 
libnetclient entirely depends upon GMime passing the proper input, I added a 
new GMime filter to remove unwanted headers from a GMime stream.  Currently, 
the all Bcc:, Status:, X-Status: and X-Balsa-* headers are removed, but this 
could easily be extended.

An other confusing issue was the treatment of Bcc: message recipients.  The balsa code 
used to double the message with different headers under certain circumstances, i.e. 
passing them /twice/ to the MTA.  As the RFC 5321 "RCPT TO" addresses are 
completely unrelated to RFC 5322 headers in the message itself, I removed the duplication 
(as I mentioned before, The Bcc: headers are stripped thanks to the new filter).  Please 
correct me if this is the wrong approach...

As libnetclient transparently handles SSL and STARTTLS encryption, I joined the 
respective options into a "security" setting, with warnings about insecure 
options (this may be controversial, as an unencrypted connection to localhost is not 
problematic).  However, IMO the SMTP configuration dialogue needs some changes, inter 
alia user certificate selection (see below), and maybe a check box whether authentication 
is required.

The complete functionality of the current, libesmtp-based implementation should 
be available, with the following exceptions:
- Currently, only the PLAIN, LOGIN, CRAM-MD5 and CRAM-SHA1 authentication 
methods are supported.  This should cover most use cases, though (actually, 
isp's will typically enforce encryption these days, so PLAIN or LOGIN are 
safe).  If other mechanisms are required (which?) please let me know.
- Authentication using user-certificates is not yet supported; it's in 
libnetclient, but the config gui needs to be changed.  I wonder if anyone used 
it, as there is no way to set the user certificate in the config dialogue (only 
the pass phrase).  Anyone?

I added some calls to g_debug() in several places, so if you want to see more details 
about the internal operation set the environment variable 
"G_MESSAGES_DEBUG=all".

It should also be easy to use libnetclient for POP3, btw.  I already 
implemented a simple class, but it's not yet tested.

What do you think of my approach?  As always, any comment or suggestion would 
be highly appreciated!

Cheers,
Albrecht.

--
Here are more details about the changes in the different source files:

* configure.ac: remove libesmtp and sendmail checks, add gnutls and the libnetclient 
"specials" (see above)
* Makefile.am: add libnetclient folder
* libinit_balsa/Makefile.am, src/Makefile.am: include libnetclient
* libbalsa/Makefile.am: include libnetclient, add new GMime filter
* libbalsa/gmime-filter-header.[hc]: implement filter as to strip RFC 5322 
message headers
* libbalsa/identity.[hc], libbalsa/libbalsa.h, libbalsa/send.h, 
libinit_balsa/assistant_page_user.[hc], src/balsa-app.[hc], 
src/balsa-message.c, src/balsa-mime-widget-message.c, 
src/balsa-mime-widget-vcalendar.c, src/main-window.c, src/pref-manager.c, 
src/save-restore.c, src/sendmsg-window.c: strip libesmtp-related conditionals
* libbalsa/send.c: replace all libesmtp related stuff by libnetclient, strip 
all sendmail-related implementations; *HUGE* change...
* libbalsa/server.[hc]: add "Security" option (but keep ssl and tls)
* libbalsa/smtp-server.[hc]: strip libesmtp-related conditionals, use Security 
option in GUI
* po/POTFILES.in: add libnetclient files to translatables (*Note:* all the *.po 
files still must be updated!)

Attachment: pgp4LxqSfbAtt.pgp
Description: PGP signature

_______________________________________________
balsa-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/balsa-list

Reply via email to