Author: knhor Date: Sun Dec 31 03:20:45 2006 New Revision: 3876 Modified: freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c Log: add simple chat permissions using the following configuration syntax example; <configuration name="conference.conf" description="Audio Conference"> <profiles> <profile name="default"> <param name="chat-permissions" value="default"/> </profile> </profiles> <chat-permissions> <profile name="default"> <!-- both of these users have a functionally equivalent capability set --> <user name="bob@somewhere.com" commands="all"/> <!-- individually specified commands must be book-end'ed with the | charachter --> <user name="harry@somewhere.com" commands="|deaf|dial|energy|kick|list|lock|mute|norecord|play|record|relate|say|saymember|stop|transfer|undeaf|unlock|unmute|volume_in|volume_out|"/> </profile> </chat-permissions> </configuration> Modified: freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c ============================================================================== --- freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c (original) +++ freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c Sun Dec 31 03:20:45 2006 @@ -184,6 +184,7 @@ char *profile_name; char *domain; char *caller_controls; + char *chat_permissions; uint32_t flags; switch_call_cause_t bridge_hangup_cause; switch_mutex_t *flag_mutex; @@ -199,7 +200,7 @@ int32_t energy_level; uint8_t min; conf_xml_cfg_t xml_cfg; -// switch_hash_t *chat_permissions; + switch_hash_t *chat_permissions_map; } conference_obj_t; /* Relationship with another member */ @@ -1477,8 +1478,6 @@ xml_menus = switch_xml_child(menu_group, "menus"); xml_menu = (xml_menus != NULL ? switch_xml_find_child(xml_menus, "menu", "name", menu_name) : NULL); - - /* if we found the requested menu in our menu_group */ if (xml_menu != NULL && xml_menu != NULL) { *ctx = (caller_control_menu_ctx_t *)switch_core_alloc(conference->pool, sizeof(caller_control_menu_ctx_t)); @@ -3255,7 +3254,7 @@ static api_command_t conf_api_sub_commands[] = { {"deaf", (api_cmd_fn_t)&conf_api_sub_deaf, CONF_API_SUB_MEMBER_TARGET, "<confname> deaf <[member_id|all]|last>"}, {"dial", (api_cmd_fn_t)&conf_api_sub_dial, CONF_API_SUB_ARGS_SPLIT, "<confname> dial <endpoint_module_name>/<destination> <callerid number> <callerid name> <flags>"}, - {"energy", (api_cmd_fn_t)&conf_api_sub_energy, CONF_API_SUB_MEMBER_TARGET, "<confname> energy <member_id|all|last> [<newval>]"}, + {"energy", (api_cmd_fn_t)&conf_api_sub_energy, CONF_API_SUB_MEMBER_TARGET, "<confname> energy <member_id|all|last> [<newval>]"}, {"kick", (api_cmd_fn_t)&conf_api_sub_kick, CONF_API_SUB_MEMBER_TARGET, "<confname> kick <[member_id|all|last]>"}, {"list", (api_cmd_fn_t)&conf_api_sub_list, CONF_API_SUB_ARGS_SPLIT, "<confname> list [delim <string>]"}, {"lock", (api_cmd_fn_t)&conf_api_sub_lock, CONF_API_SUB_ARGS_SPLIT, "<confname> lock"}, @@ -3627,7 +3626,7 @@ #ifdef OPTION_IVR_MENU_SUPPORT xml_cfg->menus = switch_xml_child(cfg, "menus"); #endif - xml_cfg->chat_permissions = switch_xml_child(cfg, "chat-permisions"); + xml_cfg->chat_permissions = switch_xml_child(cfg, "chat-permissions"); status = SWITCH_STATUS_SUCCESS; } } @@ -4093,12 +4092,15 @@ if (body != NULL && (lbuf = strdup(body))) { int argc; char *argv[25]; + char *perm = NULL; memset(argv, 0, sizeof(argv)); argc = switch_separate_string(lbuf, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); /* try to find a command to execute */ if (argc) { + char *cmd = switch_mprintf("|%s|",argv[0]); + /* special case list */ if (strcasecmp(argv[0], "list") == 0) { stream.write_function(&stream, "(%u member%s, %s)\n", @@ -4108,12 +4110,16 @@ ); conference_list_pretty(conference, &stream); #ifdef ENABLE_CHAT_ADMIN - /* provide help */ - } else if (strcasecmp(argv[0], "help") == 0 || strcasecmp(argv[0], "commands") == 0) { - stream.write_function(&stream, "%s\n", conf_api_interface.syntax); - /* find a normal command */ - } else { - conf_api_dispatch(conference, &stream, argc, argv, (const char *)body); + } else if (conference->chat_permissions != NULL + && (perm = (char *) switch_core_hash_find(conference->chat_permissions_map, from)) != NULL + && (strcasecmp(perm,"all") == 0 || (cmd != NULL && strstr(perm,cmd) != NULL))) { + /* provide help */ + if (strcasecmp(argv[0], "help") == 0 || strcasecmp(argv[0], "commands") == 0) { + stream.write_function(&stream, "%s\n", conf_api_interface.syntax); + /* find a normal command */ + } else { + conf_api_dispatch(conference, &stream, argc, argv, (const char *)body); + } #endif } } else { @@ -4148,6 +4154,45 @@ /*.chat_interface */ &conference_chat_interface }; +switch_status_t chat_permissions_get(conference_obj_t *conference) +{ + switch_status_t status = SWITCH_STATUS_FALSE; + int count = 0; + + assert(conference != NULL); + + if (conference->xml_cfg.chat_permissions != NULL && !switch_strlen_zero(conference->chat_permissions)) { + switch_xml_t profile = switch_xml_find_child(conference->xml_cfg.chat_permissions, "profile", "name", conference->chat_permissions); + + if (profile != NULL) { + switch_xml_t xml_kvp; + + if (conference->chat_permissions_map != NULL) { + switch_core_hash_destroy(conference->chat_permissions_map); + } + switch_core_hash_init(&conference->chat_permissions_map, conference->pool); + + if (conference->chat_permissions_map != NULL) { + for (xml_kvp = switch_xml_child(profile, "user"); xml_kvp; xml_kvp = xml_kvp->next) { + char *name = (char *) switch_xml_attr(xml_kvp, "name"); + char *commands = (char *) switch_xml_attr(xml_kvp, "commands"); + + if (!switch_strlen_zero(name) && !switch_strlen_zero(commands)) { + switch_core_hash_insert(conference->chat_permissions_map, name, commands); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "chat-permissions %s=%s\n",name,commands); + count ++; + } + } + if (count != 0) { + status = SWITCH_STATUS_SUCCESS; + } + } + } + } + + return status; +} + /* create a new conferene with a specific profile */ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t *xml_cfg, switch_memory_pool_t *pool) { @@ -4175,6 +4220,7 @@ char *caller_id_name = NULL; char *caller_id_number = NULL; char *caller_controls = NULL; + char *chat_permissions = NULL; uint32_t rate = 8000, interval = 20; switch_status_t status; @@ -4245,6 +4291,8 @@ caller_id_number = val; } else if (!strcasecmp(var, "caller-controls")) { caller_controls = val; + } else if (!strcasecmp(var, "chat-permissions")) { + chat_permissions = val; } } @@ -4362,6 +4410,10 @@ conference->caller_controls = switch_core_strdup(conference->pool, caller_controls); } + if (!switch_strlen_zero(chat_permissions)) { + conference->chat_permissions = switch_core_strdup(conference->pool, chat_permissions); + } + conference->name = switch_core_strdup(conference->pool, name); if (domain) { conference->domain = switch_core_strdup(conference->pool, domain); @@ -4374,6 +4426,10 @@ /* copy the xml config sections to the new conference */ memcpy(&conference->xml_cfg,xml_cfg,sizeof(conf_xml_cfg_t)); + /* build the chat interface permissions map */ + chat_permissions_get(conference); + + /* Activate the conference mutex for exclusivity */ switch_mutex_init(&conference->mutex, SWITCH_MUTEX_NESTED, conference->pool); switch_mutex_init(&conference->member_mutex, SWITCH_MUTEX_NESTED, conference->pool);