diff options
Diffstat (limited to 'main/stasis_bridges.c')
-rw-r--r-- | main/stasis_bridges.c | 87 |
1 files changed, 60 insertions, 27 deletions
diff --git a/main/stasis_bridges.c b/main/stasis_bridges.c index 7d078f9d0..b92d048bc 100644 --- a/main/stasis_bridges.c +++ b/main/stasis_bridges.c @@ -135,9 +135,15 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") static struct ast_manager_event_blob *attended_transfer_to_ami(struct stasis_message *message); static struct ast_manager_event_blob *blind_transfer_to_ami(struct stasis_message *message); -static struct ast_json *ast_channel_entered_bridge_to_json(struct stasis_message *msg); -static struct ast_json *ast_channel_left_bridge_to_json(struct stasis_message *msg); -static struct ast_json *ast_bridge_merge_message_to_json(struct stasis_message *msg); +static struct ast_json *ast_channel_entered_bridge_to_json( + struct stasis_message *msg, + const struct stasis_message_sanitizer *sanitize); +static struct ast_json *ast_channel_left_bridge_to_json( + struct stasis_message *msg, + const struct stasis_message_sanitizer *sanitize); +static struct ast_json *ast_bridge_merge_message_to_json( + struct stasis_message *msg, + const struct stasis_message_sanitizer *sanitize); static struct stasis_cp_all *bridge_cache_all; @@ -316,17 +322,25 @@ static struct ast_bridge_merge_message *bridge_merge_message_create(struct ast_b return msg; } -static struct ast_json *ast_bridge_merge_message_to_json(struct stasis_message *msg) +static struct ast_json *ast_bridge_merge_message_to_json( + struct stasis_message *msg, + const struct stasis_message_sanitizer *sanitize) { - struct ast_bridge_merge_message *merge; + struct ast_bridge_merge_message *merge = stasis_message_data(msg); + RAII_VAR(struct ast_json *, json_bridge_to, + ast_bridge_snapshot_to_json(merge->to, sanitize), ast_json_unref); + RAII_VAR(struct ast_json *, json_bridge_from, + ast_bridge_snapshot_to_json(merge->from, sanitize), ast_json_unref); - merge = stasis_message_data(msg); + if (!json_bridge_to || !json_bridge_from) { + return NULL; + } - return ast_json_pack("{s: s, s: o, s: o, s: o}", + return ast_json_pack("{s: s, s: o, s: O, s: O}", "type", "BridgeMerged", "timestamp", ast_json_timeval(*stasis_message_timestamp(msg), NULL), - "bridge", ast_bridge_snapshot_to_json(merge->to), - "bridge_from", ast_bridge_snapshot_to_json(merge->from)); + "bridge", json_bridge_to, + "bridge_from", json_bridge_from); } void ast_bridge_publish_merge(struct ast_bridge *to, struct ast_bridge *from) @@ -443,45 +457,63 @@ static struct ast_json *simple_bridge_channel_event( const char *type, struct ast_bridge_snapshot *bridge_snapshot, struct ast_channel_snapshot *channel_snapshot, - const struct timeval *tv) + const struct timeval *tv, + const struct stasis_message_sanitizer *sanitize) { - return ast_json_pack("{s: s, s: o, s: o, s: o}", + RAII_VAR(struct ast_json *, json_bridge, + ast_bridge_snapshot_to_json(bridge_snapshot, sanitize), ast_json_unref); + RAII_VAR(struct ast_json *, json_channel, + ast_channel_snapshot_to_json(channel_snapshot, sanitize), ast_json_unref); + + if (!json_bridge || !json_channel) { + return NULL; + } + + return ast_json_pack("{s: s, s: o, s: O, s: O}", "type", type, "timestamp", ast_json_timeval(*tv, NULL), - "bridge", ast_bridge_snapshot_to_json(bridge_snapshot), - "channel", ast_channel_snapshot_to_json(channel_snapshot)); + "bridge", json_bridge, + "channel", json_channel); } -struct ast_json *ast_channel_entered_bridge_to_json(struct stasis_message *msg) +struct ast_json *ast_channel_entered_bridge_to_json( + struct stasis_message *msg, + const struct stasis_message_sanitizer *sanitize) { struct ast_bridge_blob *obj = stasis_message_data(msg); return simple_bridge_channel_event("ChannelEnteredBridge", obj->bridge, - obj->channel, stasis_message_timestamp(msg)); + obj->channel, stasis_message_timestamp(msg), sanitize); } -struct ast_json *ast_channel_left_bridge_to_json(struct stasis_message *msg) +struct ast_json *ast_channel_left_bridge_to_json( + struct stasis_message *msg, + const struct stasis_message_sanitizer *sanitize) { struct ast_bridge_blob *obj = stasis_message_data(msg); return simple_bridge_channel_event("ChannelLeftBridge", obj->bridge, - obj->channel, stasis_message_timestamp(msg)); + obj->channel, stasis_message_timestamp(msg), sanitize); } -typedef struct ast_json *(*json_item_serializer_cb)(void *obj); - -static struct ast_json *container_to_json_array(struct ao2_container *items, json_item_serializer_cb item_cb) +static struct ast_json *container_to_json_array(struct ao2_container *items, + const struct stasis_message_sanitizer *sanitize) { RAII_VAR(struct ast_json *, json_items, ast_json_array_create(), ast_json_unref); - void *item; + char *item; struct ao2_iterator it; if (!json_items) { return NULL; } - it = ao2_iterator_init(items, 0); - while ((item = ao2_iterator_next(&it))) { - if (ast_json_array_append(json_items, item_cb(item))) { + for (it = ao2_iterator_init(items, 0); + (item = ao2_iterator_next(&it)); ao2_cleanup(item)) { + if (sanitize && sanitize->channel_id && sanitize->channel_id(item)) { + continue; + } + + if (ast_json_array_append(json_items, ast_json_string_create(item))) { + ao2_cleanup(item); ao2_iterator_destroy(&it); return NULL; } @@ -500,7 +532,9 @@ static const char *capability2str(uint32_t capabilities) } } -struct ast_json *ast_bridge_snapshot_to_json(const struct ast_bridge_snapshot *snapshot) +struct ast_json *ast_bridge_snapshot_to_json( + const struct ast_bridge_snapshot *snapshot, + const struct stasis_message_sanitizer *sanitize) { RAII_VAR(struct ast_json *, json_bridge, NULL, ast_json_unref); struct ast_json *json_channels; @@ -509,8 +543,7 @@ struct ast_json *ast_bridge_snapshot_to_json(const struct ast_bridge_snapshot *s return NULL; } - json_channels = container_to_json_array(snapshot->channels, - (json_item_serializer_cb)ast_json_string_create); + json_channels = container_to_json_array(snapshot->channels, sanitize); if (!json_channels) { return NULL; } |