void conference_event_send_json(conference_obj_t *conference) { cJSON *event, *conference_desc = NULL; char *name = NULL, *domain = NULL, *dup_domain = NULL; char *event_channel = NULL; if (!conference_utils_test_flag(conference, CFLAG_JSON_EVENTS)) { return; } conference_desc = conference_cdr_json_render(conference, NULL); if (!(name = conference->name)) { name = "conference"; } if (!(domain = conference->domain)) { dup_domain = switch_core_get_domain(SWITCH_TRUE); if (!(domain = dup_domain)) { domain = "cluecon.com"; } } event_channel = switch_mprintf("conference.%q@%q", name, domain); event = cJSON_CreateObject(); json_add_child_string(event, "eventChannel", event_channel); cJSON_AddItemToObject(event, "data", conference_desc); switch_event_channel_broadcast(event_channel, &event, "mod_conference", conference_globals.event_channel_id); switch_safe_free(dup_domain); switch_safe_free(event_channel); }
void conference_event_send_rfc(conference_obj_t *conference) { switch_event_t *event; char *body; char *name = NULL, *domain = NULL, *dup_domain = NULL; if (!conference_utils_test_flag(conference, CFLAG_RFC4579)) { return; } if (!(name = conference->name)) { name = "conference"; } if (!(domain = conference->domain)) { dup_domain = switch_core_get_domain(SWITCH_TRUE); if (!(domain = dup_domain)) { domain = "cluecon.com"; } } if (switch_event_create(&event, SWITCH_EVENT_CONFERENCE_DATA) == SWITCH_STATUS_SUCCESS) { event->flags |= EF_UNIQ_HEADERS; switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "conference-name", name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "conference-domain", domain); body = conference_cdr_rfc4579_render(conference, NULL, event); switch_event_add_body(event, "%s", body); free(body); switch_event_fire(&event); } switch_safe_free(dup_domain); }
static void valet_send_presence(const char *lot_name, valet_lot_t *lot, valet_token_t *token, switch_bool_t in) { char *domain_name, *dup_lot_name = NULL, *dup_domain_name = NULL; switch_event_t *event; int count; dup_lot_name = strdup(lot_name); lot_name = dup_lot_name; if ((domain_name = strchr(dup_lot_name, '@'))) { *domain_name++ = '\0'; } if (zstr(domain_name)) { dup_domain_name = switch_core_get_domain(SWITCH_TRUE); domain_name = dup_domain_name; } if (zstr(domain_name)) { domain_name = "cluecon.com"; } count = valet_lot_count(lot); if (count > 0) { if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", VALET_PROTO); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", lot_name); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", lot_name, domain_name); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "force-status", "Active (%d caller%s)", count, count == 1 ? "" : "s"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", "active"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alt_event_type", "dialog"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event_count", "%d", EC++); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "unique-id", lot_name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "channel-state", "CS_ROUTING"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "answer-state", "confirmed"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-direction", "inbound"); switch_event_fire(&event); } } else { if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", VALET_PROTO); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", lot_name); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", lot_name, domain_name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "force-status", "Empty"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", "unknown"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alt_event_type", "dialog"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event_count", "%d", EC++); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "unique-id", lot_name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "channel-state", "CS_HANGUP"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "answer-state", "terminated"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-direction", "inbound"); switch_event_fire(&event); } } if (in) { if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", VALET_PROTO); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", token->ext); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", token->ext, domain_name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "force-status", token->bridged == 0 ? "Holding" : "Active"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", "active"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alt_event_type", "dialog"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event_count", "%d", EC++); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "unique-id", token->ext); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "channel-state", "CS_ROUTING"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "answer-state", "confirmed"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-direction", token->bridged == 0 ? "outbound" : "inbound"); switch_event_fire(&event); } } else { if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", VALET_PROTO); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", token->ext); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", token->ext, domain_name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "force-status", "Empty"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", "unknown"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alt_event_type", "dialog"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event_count", "%d", EC++); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "unique-id", token->ext); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "channel-state", "CS_HANGUP"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "answer-state", "terminated"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-direction", "inbound"); switch_event_fire(&event); } } switch_safe_free(dup_domain_name); switch_safe_free(dup_lot_name); }
static abyss_bool http_directory_auth(TSession *r, char *domain_name) { char *p = NULL; char *x = NULL; char z[256] = "", t[80] = ""; char user[512] = "" ; char *pass = NULL; const char *mypass1 = NULL, *mypass2 = NULL; const char *box = NULL; int at = 0; char *dp = NULL; abyss_bool rval = FALSE; char *dup_domain = NULL; p = RequestHeaderValue(r, "authorization"); if (p) { NextToken((const char **const) &p); x = GetToken(&p); if (x) { if (!strcasecmp(x, "basic")) { NextToken((const char **const) &p); switch_b64_decode(p, user, sizeof(user)); if ((pass = strchr(user, ':'))) { *pass++ = '\0'; } if ((dp = strchr(user, '@'))) { *dp++ = '\0'; domain_name = dp; at++; } if (!domain_name) { if (globals.virtual_host) { if ((domain_name = (char *) r->requestInfo.host)) { if (!strncasecmp(domain_name, "www.", 3)) { domain_name += 4; } } } if (!domain_name) { if (globals.default_domain) { domain_name = globals.default_domain; } else { if ((dup_domain = switch_core_get_domain(SWITCH_TRUE))) { domain_name = dup_domain; } } } } if (zstr(user) || zstr(domain_name)) { goto fail; } if (!zstr(globals.realm) && !zstr(globals.user) && !zstr(globals.pass)) { if (at) { switch_snprintf(z, sizeof(z), "%s@%s:%s", globals.user, globals.realm, globals.pass); } else { switch_snprintf(z, sizeof(z), "%s:%s", globals.user, globals.pass); } xmlrpc_base64Encode(z, t); if (!strcmp(p, t)) { goto authed; } } if (!user_attributes(user, domain_name, &mypass1, &mypass2, &box, NULL)) { goto fail; } if (!zstr(mypass2) && !strcasecmp(mypass2, "user-choose")) { switch_safe_free(mypass2); } if (!mypass1) { goto authed; } else { if (at) { switch_snprintf(z, sizeof(z), "%s@%s:%s", user, domain_name, mypass1); } else { switch_snprintf(z, sizeof(z), "%s:%s", user, mypass1); } xmlrpc_base64Encode(z, t); if (!strcmp(p, t)) { goto authed; } if (mypass2) { if (at) { switch_snprintf(z, sizeof(z), "%s@%s:%s", user, domain_name, mypass2); } else { switch_snprintf(z, sizeof(z), "%s:%s", user, mypass2); } xmlrpc_base64Encode(z, t); if (!strcmp(p, t)) { goto authed; } } if (box) { if (at) { switch_snprintf(z, sizeof(z), "%s@%s:%s", box, domain_name, mypass1); } else { switch_snprintf(z, sizeof(z), "%s:%s", box, mypass1); } xmlrpc_base64Encode(z, t); if (!strcmp(p, t)) { goto authed; } if (mypass2) { if (at) { switch_snprintf(z, sizeof(z), "%s@%s:%s", box, domain_name, mypass2); } else { switch_snprintf(z, sizeof(z), "%s:%s", box, mypass2); } xmlrpc_base64Encode(z, t); if (!strcmp(p, t)) { goto authed; } } } } goto fail; authed: switch_snprintf(z, sizeof(z), "%s@%s", (box ? box : user), domain_name); r->requestInfo.user = strdup(z); ResponseAddField(r, "freeswitch-user", (box ? box : user)); ResponseAddField(r, "freeswitch-domain", domain_name); rval = TRUE; goto done; } } } fail: switch_snprintf(z, sizeof(z), "Basic realm=\"%s\"", domain_name ? domain_name : globals.realm); ResponseAddField(r, "WWW-Authenticate", z); ResponseStatus(r, 401); done: switch_safe_free(mypass1); switch_safe_free(mypass2); switch_safe_free(box); switch_safe_free(dup_domain); return rval; }