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