30 #define uri_VCARD "vcard-temp"
33 #define VCARD_MAX_FIELD_SIZE (16384)
52 "N/FAMILY",
"n-family",
54 "N/MIDDLE",
"n-middle",
55 "N/PREFIX",
"n-prefix",
56 "N/SUFFIX",
"n-suffix",
57 "NICKNAME",
"nickname",
58 "PHOTO/TYPE",
"photo-type",
59 "PHOTO/BINVAL",
"photo-binval",
60 "PHOTO/EXTVAL",
"photo-extval",
62 "ADR/POBOX",
"adr-pobox",
63 "ADR/EXTADD",
"adr-extadd",
64 "ADR/STREET",
"adr-street",
65 "ADR/LOCALITY",
"adr-locality",
66 "ADR/REGION",
"adr-region",
67 "ADR/PCODE",
"adr-pcode",
68 "ADR/CTRY",
"adr-country",
70 "EMAIL/USERID",
"email",
71 "JABBERID",
"jabberid",
78 "LOGO/TYPE",
"logo-type",
79 "LOGO/BINVAL",
"logo-binval",
80 "LOGO/EXTVAL",
"logo-extval",
81 "AGENT/EXTVAL",
"agent-extval",
82 "ORG/ORGNAME",
"org-orgname",
83 "ORG/ORGUNIT",
"org-orgunit",
86 "SORT-STRING",
"sort-string",
87 "SOUND/PHONETIC",
"sound-phonetic",
88 "SOUND/BINVAL",
"sound-binval",
89 "SOUND/EXTVAL",
"sound-extval",
93 "KEY/TYPE",
"key-type",
94 "KEY/CRED",
"key-cred",
102 char ekey[10], *cdata;
103 const char *vkey, *dkey, *vskey;
110 o = os_object_new(os);
118 if( !strcmp(vkey,
"PHOTO/BINVAL") ) {
124 vskey = strchr(vkey,
'/');
129 sprintf(ekey,
"%.*s", (
int) (vskey - vkey), vkey);
142 cdata = malloc(fieldsize);
145 cdata[fieldsize-1] =
'\0';
146 os_object_put(o, dkey, cdata, os_type_STRING);
158 char ekey[10], *dval;
159 const char *vkey, *dkey, *vskey;
163 pkt =
pkt_create(sm,
"iq",
"result", NULL, NULL);
166 if(!os_iter_first(os))
168 o = os_iter_object(os);
176 if(!os_object_get_str(os, o, dkey, &dval))
179 vskey = strchr(vkey,
'/');
184 sprintf(ekey,
"%.*s", (
int) (vskey - vkey), vkey);
191 log_debug(
ZONE,
"extracted dbkey %s val '%s' for vcard key %s", dkey, dval, vkey);
193 if (!strcmp(dkey,
"tel")) {
303 ret = storage_get(mi->
sm->
st,
"vcard", pkt->
to->
domain, NULL, &os);
354 ret = storage_get(user->
sm->
st,
"vcard",
jid_user(user->
jid), NULL, &os);
392 storage_delete(mi->
sm->
st,
"vcard",
jid_user(jid), NULL);
405 if(mod->
init)
return 0;
mod_ret_t(* pkt_sm)(mod_instance_t mi, pkt_t pkt)
pkt-sm handler
user_t user
user this session belongs to
pkt_type_t type
packet type
int sm_register_ns(sm_t sm, const char *uri)
register a new global ns
jid_t jid
session jid (user@host/res)
struct nad_elem_st * elems
data structures and prototypes for the session manager
#define NAD_CDATA_L(N, E)
void sm_unregister_ns(sm_t sm, const char *uri)
unregister a global ns
const char * jid_user(jid_t jid)
expand and return the user
const char * jid_full(jid_t jid)
expand and return the full
single instance of a module in a chain
static pkt_t _iq_vcard_to_pkt(sm_t sm, os_t os)
int nad_find_elem(nad_t nad, int elem, int ns, const char *name, int depth)
locate the next elem at a given depth with an optional matching name
void nad_append_cdata(nad_t nad, const char *cdata, int len, int depth)
append new cdata to the last elem
config_t config
config context
int init
number of times the module intialiser has been called
#define stanza_err_FEATURE_NOT_IMPLEMENTED
int nad_add_namespace(nad_t nad, const char *uri, const char *prefix)
bring a new namespace into scope
#define stanza_err_FORBIDDEN
int j_atoi(const char *a, int def)
int nad_append_elem(nad_t nad, int ns, const char *name, int depth)
create a new elem on the list
size_t vcard_max_field_size_default
void nad_set_attr(nad_t nad, int elem, int ns, const char *name, const char *val, int vallen)
create, update, or zap any matching attr on this elem
static mod_ret_t _iq_vcard_pkt_sm(mod_instance_t mi, pkt_t pkt)
module_t mod
module that this is an instance of
jid_t from
packet addressing (not used for routing)
void feature_unregister(sm_t sm, const char *feature)
unregister feature
void * private
module private data
packet summary data wrapper
storage_t st
storage subsystem
size_t vcard_max_field_size_avatar
nad_t nad
nad of the entire packet
session manager global context
#define stanza_err_RESOURCE_CONSTRAINT
mod_ret_t(* in_sess)(mod_instance_t mi, sess_t sess, pkt_t pkt)
in-sess handler
struct _mod_iq_vcard_st * mod_iq_vcard_t
static const char * _iq_vcard_map[]
these are the vcard attributes that gabber supports.
void pkt_id(pkt_t src, pkt_t dest)
convenience - copy the packet id from src to dest
void pkt_router(pkt_t pkt)
DLLEXPORT int module_init(mod_instance_t mi, const char *arg)
void feature_register(sm_t sm, const char *feature)
register a feature
void(* user_delete)(mod_instance_t mi, jid_t jid)
user-delete handler
packet was unhandled, should be passed to the next module
static void _iq_vcard_user_delete(mod_instance_t mi, jid_t jid)
#define stanza_err_ITEM_NOT_FOUND
packet was handled (and freed)
static mod_ret_t _iq_vcard_pkt_user(mod_instance_t mi, user_t user, pkt_t pkt)
There is one instance of this struct per user who is logged in to this c2s instance.
static void _iq_vcard_free(module_t mod)
void(* free)(module_t mod)
called when module is freed
static mod_ret_t _iq_vcard_in_sess(mod_instance_t mi, sess_t sess, pkt_t pkt)
mod_ret_t(* pkt_user)(mod_instance_t mi, user_t user, pkt_t pkt)
pkt-user handler
jid_t jid_dup(jid_t jid)
duplicate a jid
jid_t jid
user jid (user@host)
const char * config_get_one(config_t c, const char *key, int num)
get config value n for this key
static os_t _iq_vcard_to_object(mod_instance_t mi, pkt_t pkt)
pkt_t pkt_create(sm_t sm, const char *elem, const char *type, const char *to, const char *from)
mod_ret_t
module return values
#define stanza_err_SERVICE_UNAVAILABLE
#define stanza_err_INTERNAL_SERVER_ERROR
void pkt_sess(pkt_t pkt, sess_t sess)
int sm_storage_rate_limit(sm_t sm, const char *owner)
#define VCARD_MAX_FIELD_SIZE