]> git.g-eek.se Git - interimap.git/commitdiff
Remove support for the Binary Content extension [RFC3516].
authorGuilhem Moulin <guilhem@fripost.org>
Tue, 15 Sep 2015 14:48:29 +0000 (16:48 +0200)
committerGuilhem Moulin <guilhem@fripost.org>
Tue, 15 Sep 2015 15:10:11 +0000 (17:10 +0200)
“If the server does not know how to decode the section's CTE, it MUST
fail the request and issue a "NO" response that contains the
"UNKNOWN-CTE" extended response code.” — [RFC3516 section 4.3]

Unfortunately the client doesn't know which message couldn't be decoded,
so it can't fallback and use BODY instead.

This made ‘use-binary=NO’ pretty much mandatory.  Hence we remove
support for BINARY [RFC3516].  Instead, we increase the thresold for
when to add Zlib full flush points from 4096 to the buffer size (32768).

Changelog
README
interimap
interimap.1
interimap.sample
lib/Net/IMAP/InterIMAP.pm

index 9d864f877a1dad23d430130520bcda73cd1ffa6a..67f6833b7d654702651ecd48419bdc356204ffb9 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -6,10 +6,6 @@ interimap (0.2) upstream;
     server.
   * Add a configuration option 'null-stderr=YES' to send STDERR to
     /dev/null for type=tunnel.
-  * Add support for the Binary Content extension [RFC3516].  Enabled by
-    default if both the local and remote servers advertize "BINARY".
-       Can be disabled by adding 'use-binary=NO' to the default section in
-       the configuration file.
   * Exit with return value 0 when receiving a SIGTERM.
   * Add SSL options SINGLE_ECDH_USE, SINGLE_DH_USE, NO_SSLv2, NO_SSLv3
     and NO_COMPRESSION to the compiled-in CTX options.
diff --git a/README b/README
index 2809ccb9ed20f0827ed8df0aaf4a51f511fd9d1f..bf2e052870b2000e8df0287c2493cb46b201f09e 100644 (file)
--- a/README
+++ b/README
@@ -28,9 +28,8 @@ extensions are:
   * LITERAL+ [RFC2088] non-synchronizing literals (recommended),
   * MULTIAPPEND [RFC3502] (recommended),
   * COMPRESS=DEFLATE [RFC4978] (recommended),
-  * SASL-IR [RFC4959] SASL Initial Client Response,
-  * UNSELECT [RFC3691], and
-  * BINARY [RFC3516].
+  * SASL-IR [RFC4959] SASL Initial Client Response, and
+  * UNSELECT [RFC3691].
 
 
 #######################################################################
index b3a73424fce08a2fcf7374fbdf071955ddc79854..45a6643ac0aeab49ed86d6dacd1754967b75ed00 100755 (executable)
--- a/interimap
+++ b/interimap
@@ -74,7 +74,6 @@ my $CONF = read_config( delete $CONFIG{config} // $NAME
                       , 'list-mailbox' => qr/\A([\x01-\x09\x0B\x0C\x0E-\x7F]+)\z/
                       , 'list-select-opts' => qr/\A([\x21\x23\x24\x26\x27\x2B-\x5B\x5E-\x7A\x7C-\x7E]+)\z/
                       , 'ignore-mailbox' => qr/\A([\x01-\x09\x0B\x0C\x0E-\x7F]+)\z/
-                      , 'use-binary' => qr/\A(YES|NO)\z/i,
                       );
 my ($DBFILE, $LOCKFILE, $LOGGER_FD);
 
@@ -512,10 +511,7 @@ sub sync_mailbox_list() {
 
 sync_mailbox_list();
 ($lIMAP, $rIMAP) = map {$IMAP->{$_}->{client}} qw/local remote/;
-my $ATTRS = 'MODSEQ FLAGS INTERNALDATE '.
-            (((!defined $CONF->{_} or $CONF->{_}->{'use-binary'} // 1) and
-             !$lIMAP->incapable('BINARY') and !$rIMAP->incapable('BINARY'))
-                ? 'BINARY' : 'BODY').'.PEEK[]';
+my $ATTRS = join ' ', qw/MODSEQ FLAGS INTERNALDATE BODY.PEEK[]/;
 
 
 #############################################################################
@@ -600,7 +596,7 @@ sub download_missing($$$@) {
     my $attrs = $ATTRS.' ENVELOPE';
     ($source eq 'local' ? $lIMAP : $rIMAP)->fetch(compact_set(@set), "($attrs)", sub($) {
         my $mail = shift;
-        return unless exists $mail->{RFC822} or exists $mail->{BINARY}; # not for us
+        return unless exists $mail->{RFC822}; # not for us
 
         my $uid = $mail->{UID};
         my $from = first { defined $_ and @$_ } @{$mail->{ENVELOPE}}[2,3,4];
@@ -969,10 +965,9 @@ sub sync_known_messages($$) {
 # after the FETCH.
 sub callback_new_message($$$$;$$$) {
     my ($idx, $mailbox, $name, $mail, $UIDs, $buff, $bufflen) = @_;
+    return unless exists $mail->{RFC822}; # not for us
 
-    my $length = defined $mail->{RFC822} ? length(${$mail->{RFC822}})
-               : defined $mail->{BINARY} ? length(${$mail->{BINARY}})
-               : return; # not for us
+    my $length = length ${$mail->{RFC822}};
     if ($length == 0) {
         msg("$name($mailbox)", "WARNING: Ignoring new 0-length message (UID $mail->{UID})");
         return;
index 621d96829ccddb1ccde86129580896238667d5d7..d0c547493c05ad7b36c558d55f1cf73cfe5895cf 100644 (file)
@@ -304,18 +304,6 @@ Whether to redirect \fIcommand\fR's standard error to \(lq/dev/null\(rq
 for type \fItype\fR=tunnel.
 (Default: \(lqNO\(rq.)
 
-.TP
-.I use-binary
-Whether to use the Binary Content extension [RFC3516] in FETCH and
-APPEND commands.
-This is useful for binary attachments for instance, as it avoids the
-overhead caused by base64 encodings.  Moreover if the IMAP COMPRESS
-extension is enabled, full flush points are placed around large non-text
-literals to empty the compression dictionary.
-This option is only available in the default section, and is ignored if
-either server does not advertize \(lqBINARY\(rq in its capability list.
-(Default: \(lqYES\(rq.)
-
 .TP
 .I SSL_cipher_list
 The cipher list to send to the server.  Although the server determines
@@ -364,11 +352,9 @@ MULTIAPPEND [RFC3502] (recommended),
 .IP \[bu]
 COMPRESS=DEFLATE [RFC4978] (recommended),
 .IP \[bu]
-SASL-IR [RFC4959] SASL Initial Client Response,
-.IP \[bu]
-UNSELECT [RFC3691], and
+SASL-IR [RFC4959] SASL Initial Client Response, and
 .IP \[bu]
-BINARY [RFC3516].
+UNSELECT [RFC3691].
 
 .SH KNOWN BUGS AND LIMITATIONS
 
index 5d9d6d23d289e5a28f4a74dd85f29b5ac0b5ac02..6d52f9105a570f70ce80ce4eea649cebc5610b82 100644 (file)
@@ -2,7 +2,6 @@
 #list-mailbox = "*"
 list-select-opts = SUBSCRIBED
 ignore-mailbox = ^virtual/
-#use-binary = YES
 
 [local]
 type = tunnel
index 6f44879f0b1a2fd4ef2a515c5b1b67a92f8d9531..a761614f8c12a4b8e29e9cb287204eaed09ea07b 100644 (file)
@@ -772,9 +772,7 @@ sub remove_message($@) {
 #   Issue an APPEND command with the given mails.  Croak if the server
 #   did not advertise "UIDPLUS" (RFC 4315) in its CAPABILITY list.
 #   Each $mail is a hash reference with key 'RFC822' and optionally
-#   'FLAGS' and 'INTERNALDATE'.  If the server supports the "BINARY"
-#   extension (RFC 3516), the key 'RFC822' can be replaced with 'BINARY'
-#   to send the mail body as a binary literal.
+#   'FLAGS' and 'INTERNALDATE'.
 #   Providing multiple mails is only allowed for servers supporting
 #   "MULTIAPPEND" (RFC 3502).
 #   Return the list of UIDs allocated for the new messages.
@@ -801,11 +799,8 @@ sub append($$@) {
         my $str = ' ';
         $str .= '('.join(' ', grep {lc $_ ne '\recent'} @{$mail->{FLAGS}}).') ' if defined $mail->{FLAGS};
         $str .= '"'.$mail->{INTERNALDATE}.'" ' if defined $mail->{INTERNALDATE};
-        my ($body, $t) = defined $mail->{RFC822} ? ($mail->{RFC822}, 0)
-                       : defined $mail->{BINARY} ? ($mail->{BINARY}, 1)
-                       : $self->panic("Missing message body in APPEND");
         $self->_cmd_extend(\$str);
-        $self->_cmd_extend_lit($body, $t);
+        $self->_cmd_extend_lit($mail->{RFC822} // $self->panic("Missing message body in APPEND"));
     }
 
     $self->_cmd_flush();
@@ -1075,8 +1070,7 @@ sub pull_updates($;$) {
 #   FETCH new messages since the UIDNEXT found in the persistent cache
 #   (or 1 in no such UIDNEXT is found), and process each response on the
 #   fly with the callback.
-#   The list of attributes to FETCH, $attr, much contain either BODY or
-#   BINARY.
+#   The list of attributes to FETCH, $attr, must contain BODY[].
 #   If an @ignore list is supplied, then these messages are ignored from
 #   the UID FETCH range.
 #   Finally, update the UIDNEXT from the persistent cache to the value
@@ -1582,20 +1576,17 @@ sub _cmd_extend($$) {
 }
 
 
-# $self->_cmd_extend_lit($lit, [$lit8])
+# $self->_cmd_extend_lit($lit)
 #   Append the literal $lit to the command buffer.  $lit must be a
-#   scalar reference.  If $lit8 is true, a literal8 is sent instead [RFC
-#   3516].
-sub _cmd_extend_lit($$;$) {
-    my ($self, $lit, $lit8) = @_;
+#   scalar reference.
+sub _cmd_extend_lit($$) {
+    my ($self, $lit) = @_;
     my $len = length($$lit);
     my $d = $self->{_Z_DEFLATE};
 
-    # create a full flush point for long binary literals
-    my $z_flush = ($len > 4096 and !($self->{'use-binary'} // 1 and !$lit8)) ? 1 : 0;
-    $lit8 = $lit8 ? '~' : ''; # literal8, RFC 3516 BINARY
-
-    my $strlen = $lit8.'{'.$len.$self->{_LITPLUS}.'}'.$CRLF;
+    # create a full flush point for long literals, cf. RFC 4978 section 4
+    my $z_flush = $len > $BUFSIZE ? 1 : 0;
+    my $strlen = "{$len$self->{_LITPLUS}}$CRLF";
 
     if ($self->{_LITPLUS} ne '') {
         $self->_cmd_extend_(\$strlen);
@@ -2086,14 +2077,6 @@ sub _resp($$;$$$) {
                 elsif (s/\A(?:RFC822|BODY\[\]) //) {
                     $mail{RFC822} = \$self->_nstring(\$_);
                 }
-                elsif (s/\ABINARY\[\] //) {
-                    if (s/\A~\{([0-9]+)\}\z//) { # literal8, RFC 3516 BINARY
-                        (my $lit, $_) = $self->_getline($1);
-                        $mail{BINARY} = $lit;
-                    } else {
-                        $mail{RFC822} = \$self->_nstring(\$_);
-                    }
-                }
                 elsif (s/\AFLAGS \((\\?$RE_ATOM_CHAR+(?: \\?$RE_ATOM_CHAR+)*)?\)//) {
                     $mail{FLAGS} = defined $1 ? [ split / /, $1 ] : [];
                 }
@@ -2103,7 +2086,7 @@ sub _resp($$;$$$) {
             my $uid = $mail{UID} // $self->panic(); # sanity check
             $self->panic() unless defined $mail{MODSEQ} or !$self->_enabled('QRESYNC'); # sanity check
 
-            if (!exists $mail{RFC822} and !exists $mail{BINARY} and !exists $mail{ENVELOPE} and # ignore new mails
+            if (!exists $mail{RFC822} and !exists $mail{ENVELOPE} and # ignore new mails
                 (!exists $self->{_MODIFIED}->{$uid} or $self->{_MODIFIED}->{$uid}->[0] < $mail{MODSEQ} or
                     ($self->{_MODIFIED}->{$uid}->[0] == $mail{MODSEQ} and !defined $self->{_MODIFIED}->{$uid}->[1]))) {
                 my $flags = join ' ', sort(grep {lc $_ ne '\recent'} @{$mail{FLAGS}}) if defined $mail{FLAGS};