Hi,

i'm installing a new mail server for our faculty and want to use
the squirrelmail plugin 'avelsieve' (1.9.7). As documented on the
dovecot wiki there is a problem in the STARTTLS code and i
found a solution (that works for my installation):

i've traced the server output in 'get_response' and instead of
a script list i saw "IMPLEMENTATION". So i took a look at
the file 'managesieve.lib.php' and the STARTTLS code:

    /* If we allow STARTTLS, use it */
    if($this->capabilities['starttls'] === true && 
function_exists('stream_socket_enable_crypto') === true) {
        fputs($this->fp,"STARTTLS\r\n");
        $starttls_response = $this->line=fgets($this->fp,1024);
        if(stream_socket_enable_crypto($this->fp, true, 
STREAM_CRYPTO_METHOD_TLS_CLIENT) == false) {
            $this->error=EC_UNKNOWN;
            $this->error_raw = "Failed to establish TLS connection.";
            return false;
        } else {
            $this->loggedin = true;
            
            // RFC says that we need to ask for the capabilities again
            $this->sieve_get_capability();
            $this->loggedin = false;
        }   
    }
     
With my limited time and debugging possibilities i've found that the
dovecot managesieve server seems to send capability lines 'automagically'.
I've added a few "debugging" lines

    /* If we allow STARTTLS, use it */
    if($this->capabilities['starttls'] === true && 
function_exists('stream_socket_enable_crypto') === true) {
        fputs($this->fp,"STARTTLS\r\n");
        $starttls_response = $this->line=fgets($this->fp,1024);
        if(stream_socket_enable_crypto($this->fp, true, 
STREAM_CRYPTO_METHOD_TLS_CLIENT) == false) {
            $this->error=EC_UNKNOWN;
            $this->error_raw = "Failed to establish TLS connection.";
            return false;
        } else {
            $this->loggedin = true;
            
$starttls_response = $this->line=fgets($this->fp,1024);
$errormsg .= _("MFI fgets ") . $starttls_response . '<br>';
print_errormsg($errormsg);

            // RFC says that we need to ask for the capabilities again
            $this->sieve_get_capability();
            $this->loggedin = false;
        }   
    }

and could read

        MFI fgets "IMPLEMENTATION" "dovecot"

what will throw the following 'sieve_get_capability' out of sync.
Then i've added a second 'fgets' and received:

        MFI fgets "SASL" "PLAIN"

Then i've added a third 'fgets' and received:

        MFI fgets "SIEVE" "fileinto reject envelope vacation imapflags notify 
subaddress relational comparator-i;ascii-numeric regex"

Then i've added a fourth 'fgets' and received:

        MFI fgets OK "TLS negotiation successful."

Now the protocol should be in sync again and after removing the lines

        $errormsg .= _("MFI 1 fgets ") . $starttls_response . '<br>';
        print_errormsg($errormsg);

i could load my scripts back. So, adding four lines reading

        $starttls_response = $this->line=fgets($this->fp,1024);
        $starttls_response = $this->line=fgets($this->fp,1024);
        $starttls_response = $this->line=fgets($this->fp,1024);
        $starttls_response = $this->line=fgets($this->fp,1024);

solved the problem. I know this is not a sound "fix", but i hope to
help you with this. 

One addendum: a "debugging" using my errormsg-printout of the output from

    /* If we allow STARTTLS, use it */
    if($this->capabilities['starttls'] === true && 
function_exists('stream_socket_enable_crypto') === true) {
        fputs($this->fp,"STARTTLS\r\n");
        $starttls_response = $this->line=fgets($this->fp,1024);
        
resulted in the response:

        MFI fgets OK "Begin TLS negotiation now."

what looks proper to me, but the negotiation makes the server send the four 
lines mentioned above.


Cheers

Reply via email to