mirror of
https://github.com/processone/ejabberd
synced 2025-10-03 17:59:31 +02:00
Make mod_vcard_xupdate send hash after avatar get set for first time
We need to remove info about empty photo in session stored presence after avatar get set, otherwise as we don't modify presences like that in mod_vcard_xupdate, we will send presence with updated hash. This fixes issue #4182
This commit is contained in:
parent
537aac24f7
commit
c5437235f3
3 changed files with 24 additions and 2 deletions
|
@ -52,7 +52,8 @@
|
||||||
-export([get_presence/1, set_presence/2, resend_presence/1, resend_presence/2,
|
-export([get_presence/1, set_presence/2, resend_presence/1, resend_presence/2,
|
||||||
open_session/1, call/3, cast/2, send/2, close/1, close/2, stop_async/1,
|
open_session/1, call/3, cast/2, send/2, close/1, close/2, stop_async/1,
|
||||||
reply/2, copy_state/2, set_timeout/2, route/2, format_reason/2,
|
reply/2, copy_state/2, set_timeout/2, route/2, format_reason/2,
|
||||||
host_up/1, host_down/1, send_ws_ping/1, bounce_message_queue/2]).
|
host_up/1, host_down/1, send_ws_ping/1, bounce_message_queue/2,
|
||||||
|
reset_vcard_xupdate_resend_presence/1]).
|
||||||
|
|
||||||
-include_lib("xmpp/include/xmpp.hrl").
|
-include_lib("xmpp/include/xmpp.hrl").
|
||||||
-include("logger.hrl").
|
-include("logger.hrl").
|
||||||
|
@ -108,6 +109,10 @@ resend_presence(Pid) ->
|
||||||
resend_presence(Pid, To) ->
|
resend_presence(Pid, To) ->
|
||||||
route(Pid, {resend_presence, To}).
|
route(Pid, {resend_presence, To}).
|
||||||
|
|
||||||
|
-spec reset_vcard_xupdate_resend_presence(pid()) -> boolean().
|
||||||
|
reset_vcard_xupdate_resend_presence(Pid) ->
|
||||||
|
route(Pid, reset_vcard_xupdate_resend_presence).
|
||||||
|
|
||||||
-spec close(pid()) -> ok;
|
-spec close(pid()) -> ok;
|
||||||
(state()) -> state().
|
(state()) -> state().
|
||||||
close(Ref) ->
|
close(Ref) ->
|
||||||
|
@ -246,6 +251,13 @@ process_info(#{lserver := LServer} = State, {route, Packet}) ->
|
||||||
true ->
|
true ->
|
||||||
State1
|
State1
|
||||||
end;
|
end;
|
||||||
|
process_info(State, reset_vcard_xupdate_resend_presence) ->
|
||||||
|
case maps:get(pres_last, State, error) of
|
||||||
|
error -> State;
|
||||||
|
Pres ->
|
||||||
|
Pres2 = xmpp:remove_subtag(Pres, #vcard_xupdate{}),
|
||||||
|
process_self_presence(State#{pres_last => Pres2}, Pres2)
|
||||||
|
end;
|
||||||
process_info(#{jid := JID} = State, {resend_presence, To}) ->
|
process_info(#{jid := JID} = State, {resend_presence, To}) ->
|
||||||
case maps:get(pres_last, State, error) of
|
case maps:get(pres_last, State, error) of
|
||||||
error -> State;
|
error -> State;
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
get_vh_session_number/1,
|
get_vh_session_number/1,
|
||||||
get_vh_by_backend/1,
|
get_vh_by_backend/1,
|
||||||
force_update_presence/1,
|
force_update_presence/1,
|
||||||
|
reset_vcard_xupdate_resend_presence/1,
|
||||||
connected_users/0,
|
connected_users/0,
|
||||||
connected_users_number/0,
|
connected_users_number/0,
|
||||||
user_resources/2,
|
user_resources/2,
|
||||||
|
@ -926,6 +927,15 @@ force_update_presence({LUser, LServer}) ->
|
||||||
end,
|
end,
|
||||||
Ss).
|
Ss).
|
||||||
|
|
||||||
|
-spec reset_vcard_xupdate_resend_presence({binary(), binary()}) -> ok.
|
||||||
|
reset_vcard_xupdate_resend_presence({LUser, LServer}) ->
|
||||||
|
Mod = get_sm_backend(LServer),
|
||||||
|
Ss = get_sessions(Mod, LUser, LServer),
|
||||||
|
lists:foreach(
|
||||||
|
fun(#session{sid = {_, Pid}}) ->
|
||||||
|
ejabberd_c2s:reset_vcard_xupdate_resend_presence(Pid)
|
||||||
|
end, Ss).
|
||||||
|
|
||||||
-spec get_sm_backend(binary()) -> module().
|
-spec get_sm_backend(binary()) -> module().
|
||||||
|
|
||||||
get_sm_backend(Host) ->
|
get_sm_backend(Host) ->
|
||||||
|
|
|
@ -97,7 +97,7 @@ user_send_packet(Acc) ->
|
||||||
-spec vcard_set(iq()) -> iq().
|
-spec vcard_set(iq()) -> iq().
|
||||||
vcard_set(#iq{from = #jid{luser = LUser, lserver = LServer}} = IQ) ->
|
vcard_set(#iq{from = #jid{luser = LUser, lserver = LServer}} = IQ) ->
|
||||||
ets_cache:delete(?VCARD_XUPDATE_CACHE, {LUser, LServer}, ejabberd_cluster:get_nodes()),
|
ets_cache:delete(?VCARD_XUPDATE_CACHE, {LUser, LServer}, ejabberd_cluster:get_nodes()),
|
||||||
ejabberd_sm:force_update_presence({LUser, LServer}),
|
ejabberd_sm:reset_vcard_xupdate_resend_presence({LUser, LServer}),
|
||||||
IQ;
|
IQ;
|
||||||
vcard_set(Acc) ->
|
vcard_set(Acc) ->
|
||||||
Acc.
|
Acc.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue