Невозможно понять сбой при добавлении поля в vcard в ejabberd - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь добавить новое поле в vcard как «Abc».Для этого я добавил XML для этого поля «Abc» в файле xmpp_codec.spec.И ссылался на это в #vcard_temp.Я поместил файлы xmpp_codec.erl, xmpp_codec.hrl, xep0054.erl, сгенерированные таким образом после 'make spec', в соответствующие каталоги.

Но когда я пытаюсь добавить значение этого поля, отправив этот iq

<<"<iq id='D2sPz-22' type='set'><vCard xmlns='vcard-temp'><N><GIVEN>byname</GIVEN></N><Abc>10</Abc><FN>byname </FN><NICKNAME>byname</NICKNAME></vCard></iq>">>

Я получаю эту ошибку

[error] Hook vcard_iq_set crashed when running mod_avatar:vcard_iq_convert/1:
** Reason = {error,{badrecord,vcard_temp},[{mod_avatar,convert_avatar,[{file,"src/mod_avatar.erl"},{line,320}],3},{mod_avatar,vcard_iq_convert,[{file,"src/mod_avatar.erl"},{line,110}],1},{ejabberd_hooks,safe_apply,[{file,"src/ejabberd_hooks.erl"},{line,380}],4},{ejabberd_hooks,run_fold1,[{file,"src/ejabberd_hooks.erl"},{line,364}],4},{mod_vcard,process_sm_iq,[{file,"src/mod_vcard.erl"},{line,210}],1},{gen_iq_handler,process_iq,[{file,"src/gen_iq_handler.erl"},{line,132}],3},{gen_iq_handler,process_iq,[{file,"src/gen_iq_handler.erl"},{line,111}],4},{ejabberd_sm,route,[{file,"src/ejabberd_sm.erl"},{line,143}],1}]}
** Arguments = [{iq,<<"D2sPz-22">>,set,<<"en">>,{jid,<<"dgNW1Udm4Us">>,<<"example.com">>,<<"Smack">>,<<"dgnw1udm4us">>,<<“example.com">>,<<"Smack">>},{jid,<<"dgNW1Udm4Us">>,<<"example.com">>,<<>>,<<"dgNW1Udm4Us">>,<<"example.com">>,<<>>},[{vcard_temp,undefined,<<"myname ">>,{vcard_name,undefined,<<"myname">>,undefined,undefined,undefined},<<"myname">>,undefined,undefined,[],[],[],[],undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,[],undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,<<"10">>}],#{ip => {}}}]
06:47:47.776 [debug] SQL: "begin;"
06:47:47.776 [debug] SQL: "UPDATE vcard SET vcard='<vCard xmlns=''vcard-temp''><N><GIVEN>myname</GIVEN></N><FN>myname </FN><NICKNAME>myname</NICKNAME><Abc>10</Abc></vCard>' WHERE username='dgNW1Udm4Us'"
06:47:47.777 [debug] SQL: "UPDATE vcard_search SET username='dgNW1Udm4Us', fn='myname ', lfn='myname ', family='', lfamily='', given='myname', lgiven='myname', middle='', lmiddle='', nickname='myname', lnickname='myname', bday='', lbday='', ctry='', lctry='', locality='', llocality='', email='', lemail='', orgname='', lorgname='', orgunit='', lorgunit='', abc='', labc='' WHERE lusername='dgNW1Udm4Us'"

В mod_avtar.erl вокруг строки 320 находится эта функция

convert_avatar(LUser, LServer, VCard) ->
    case get_converting_rules(LServer) of
    [] ->
        pass;
    Rules ->
        case VCard#vcard_temp.photo of
        #vcard_photo{binval = Data} when is_binary(Data) ->
            convert_avatar(LUser, LServer, Data, Rules);
        _ ->
            pass
        end
    end.

И строка 320 - case VCard#vcard_temp.photo of внутри этой функции.

И я не могу понять эту ошибку, поскольку, поскольку я не изменил запись #vcard_photo, почему он говорит, что vcard_temp плохая запись?

РЕДАКТИРОВАТЬ

Это запись #vcard_temp, сгенерированная после добавления xml и создания спецификации

-record(vcard_temp, {version :: 'undefined' | binary(),
                     fn :: 'undefined' | binary(),
                     n :: 'undefined' | #vcard_name{},
                     nickname :: 'undefined' | binary(),
                     photo :: 'undefined' | #vcard_photo{},
                     bday :: 'undefined' | binary(),
                     adr = [] :: [#vcard_adr{}],
                     label = [] :: [#vcard_label{}],
                     tel = [] :: [#vcard_tel{}],
                     email = [] :: [#vcard_email{}],
                     jabberid :: 'undefined' | binary(),
                     mailer :: 'undefined' | binary(),
                     tz :: 'undefined' | binary(),
                     geo :: 'undefined' | #vcard_geo{},
                     title :: 'undefined' | binary(),
                     role :: 'undefined' | binary(),
                     logo :: 'undefined' | #vcard_logo{},
                     org :: 'undefined' | #vcard_org{},
                     categories = [] :: [binary()],
                     note :: 'undefined' | binary(),
                     prodid :: 'undefined' | binary(),
                     rev :: 'undefined' | binary(),
                     sort_string :: 'undefined' | binary(),
                     sound :: 'undefined' | #vcard_sound{},
                     uid :: 'undefined' | binary(),
                     url :: 'undefined' | binary(),
                     class :: 'confidential' | 'private' | 'public' | 'undefined',
                     key :: 'undefined' | #vcard_key{},
                     desc :: 'undefined' | binary(),
                     abc :: 'undefined' | binary()}).
-type vcard_temp() :: #vcard_temp{}. 

1 Ответ

0 голосов
/ 07 декабря 2018

Если вы изменили библиотеку, которая переопределяет запись (в данном случае запись vcard_temp), вам лучше перекомпилировать ejabberd, чтобы убедиться, что весь код использует новое определение записи.

Кроме того, стоит проверитьесли старое определение записи vcard_temp все еще где-то используется.Если вы используете хранилище SQL для mod_vcard, вероятно, нет, но лучше обязательно.

...