Adium sending initial presence after getroster

Brad Fitzpatrick brad at danga.com
Wed Jun 21 08:08:26 UTC 2006


Simple:  make the getroster (not setroster) IQ code detect that $conn
isn't available (simply $conn->is_available) and instead push the packets
onto a new field array on the DJabberd::Connection::ClientIn object, say,
'pending_sub_requests' instead of delivering them.  Then, on initial
presence (in Presence.pm, _process_outbound_available), at this:

    if ($conn->is_initial_presence) {
        $conn->send_presence_probes;
    }

Change it to:

    if ($conn->is_initial_presence) {
        $conn->send_presence_probes;
        $conn->send_pending_sub_requests;   # <---- new, have to implement
    }



On Tue, 20 Jun 2006, Artur Bergman wrote:

> So,
>
> Adium is currently sending a setroster first, then an initial
> presence request
>
> However, we have code in there that does this
>
>          foreach my $jid (map  { $_->jid }
>                           grep { $_->subscription->is_none_pending_in }
>                           $roster->items) {
>              my $subpkt = DJabberd::Presence->make_subscribe(to   =>
> $conn->bound_jid,
>                                                              from =>
> $jid);
>              # already in roster as pendin, we've already processed
> it, so just
>              # deliver it so user can reply with subscribed/
> unsubscribed:
>              $logger->fatal("(fooo");
>              $subpkt->deliver($conn->vhost);
>          }
>      };
>
>
> however, that later gets caught in
>
> delivery Local.pm
>
>      my $find_bares = sub {
>          @dconns = grep { $_->is_available } $vhost-
>  >find_conns_of_bare($to)
>      };
>
>
> which sees that the connection is not available...
>
> any suggestions?
>
>


More information about the Djabberd mailing list