]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Distributed Device State broken at sites using res_xmpp or res_jabber where Secuity...
authorAlec L Davis <sivad.a@paradise.net.nz>
Tue, 16 Apr 2013 23:13:58 +0000 (23:13 +0000)
committerAlec L Davis <sivad.a@paradise.net.nz>
Tue, 16 Apr 2013 23:13:58 +0000 (23:13 +0000)
res_jabber/res_xmpp were not adding AST_EVENT_IE_CACHABLE to the event as each message came in,
then devstate_change_collector_cb() was unable to find AST_EVENT_IE_CACHABLE in the event,
so defaulted incorrectly to AST_DEVSTATE_NOT_CACHABLE.

(issue ASTERISK-20175)
(closes issue ASTERISK-21429)
(closes issue ASTERISK-21069)
(closes issue ASTERISK-21164)

Reported by: alecdavis
Tested by: alecdavis
alecdavis (license 585)

Review https://reviewboard.asterisk.org/r/2452/
........

Merged revisions 385916 from http://svn.asterisk.org/svn/asterisk/branches/1.8

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@385917 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/devicestate.c
res/res_jabber.c

index 4ed51f9e3943a12f8bc4f69290c69bdf50b45a01..651a4b1d893407d40411eda932ec3369dda12d68 100644 (file)
@@ -705,7 +705,7 @@ static void *run_devstate_collector(void *data)
 static void devstate_change_collector_cb(const struct ast_event *event, void *data)
 {
        struct devstate_change *sc;
-       const char *device;
+       const char *device, *cachable_str;
        const struct ast_eid *eid;
        uint32_t state;
        enum ast_devstate_cache cachable = AST_DEVSTATE_CACHABLE;
@@ -713,7 +713,6 @@ static void devstate_change_collector_cb(const struct ast_event *event, void *da
        device = ast_event_get_ie_str(event, AST_EVENT_IE_DEVICE);
        eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
        state = ast_event_get_ie_uint(event, AST_EVENT_IE_STATE);
-       cachable = ast_event_get_ie_uint(event, AST_EVENT_IE_CACHABLE);
 
        if (ast_strlen_zero(device) || !eid) {
                ast_log(LOG_ERROR, "Invalid device state change event received\n");
@@ -726,6 +725,16 @@ static void devstate_change_collector_cb(const struct ast_event *event, void *da
        strcpy(sc->device, device);
        sc->eid = *eid;
        sc->state = state;
+
+       /* For 'cachable' we cannot use ast_event_get_ie_uint(), it overwrites the default of AST_DEVSTATE_CACHABLE we
+        * have already setup for 'cachable', if for whatever reason the AST_EVENT_IE_CACHABLE wasn't
+        * posted in the event ast_event_get_ie_uint() is going will return 0,
+        * which equates to AST_DEVSTATE_NOT_CACHABLE the first enumeration in 'ast_devstate_cache'.
+        */
+
+       if ((cachable_str = ast_event_get_ie_str(event, AST_EVENT_IE_CACHABLE))) {
+               sscanf(cachable_str, "%30u", &cachable);
+       }
        sc->cachable = cachable;
 
        ast_mutex_lock(&devstate_collector.lock);
index 910770f53ae976016f323bba50a421266fc3cf72..0cdbc9b2153798ccdc98c07f741600c8a6add55c 100644 (file)
@@ -3339,14 +3339,15 @@ static int aji_handle_pubsub_event(void *data, ikspak *pak)
                return IKS_FILTER_EAT;
        }
        if (!strcasecmp(iks_name(item_content), "state")) {
-               device_state = iks_find_cdata(item, "state");
-               if ((cachable_str = iks_find_cdata(item, "cachable"))) {
+               if ((cachable_str = iks_find_attrib(item_content, "cachable"))) {
                        sscanf(cachable_str, "%30d", &cachable);
                }
+               device_state = iks_find_cdata(item, "state");
                if (!(event = ast_event_new(AST_EVENT_DEVICE_STATE_CHANGE,
                                            AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, item_id, AST_EVENT_IE_STATE,
                                            AST_EVENT_IE_PLTYPE_UINT, ast_devstate_val(device_state), AST_EVENT_IE_EID,
                                            AST_EVENT_IE_PLTYPE_RAW, &pubsub_eid, sizeof(pubsub_eid),
+                                           AST_EVENT_IE_CACHABLE, AST_EVENT_IE_PLTYPE_UINT, cachable,
                                            AST_EVENT_IE_END))) {
                        return IKS_FILTER_EAT;
                }