]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-3332 --resolve
authorBrian West <brian@freeswitch.org>
Fri, 25 Apr 2014 20:53:11 +0000 (15:53 -0500)
committerBrian West <brian@freeswitch.org>
Fri, 25 Apr 2014 20:53:21 +0000 (15:53 -0500)
src/mod/applications/mod_directory/mod_directory.c

index bf5b4fd92c6c731f63f7832e6e85eab3c4bd4f08..9baaf8bcf12f6f480a9b38c015e530a20d1ddf7e 100644 (file)
@@ -528,6 +528,92 @@ static dir_profile_t *get_profile(const char *profile_name)
        return profile;
 }
 
+char *generate_sql_entry_for_user(switch_core_session_t *session, switch_xml_t ut, switch_bool_t use_number_alias) {
+       char *sql = NULL;
+
+       int name_visible = 1;
+       int exten_visible = 1;
+       const char *id = switch_xml_attr_soft(ut, "id");
+       const char *number_alias = switch_xml_attr_soft(ut, "number-alias");
+       const char *extension = NULL;
+       char *fullName = NULL;
+       char *caller_name = NULL;
+       char *caller_name_override = NULL;
+       char *firstName = NULL;
+       char *lastName = NULL;
+       char *fullNameDigit = NULL;
+       char *firstNameDigit = NULL;
+       char *lastNameDigit = NULL;
+       switch_xml_t x_params, x_param, x_vars, x_var;
+
+       /* Check all the user params */
+       if ((x_params = switch_xml_child(ut, "params"))) {
+               for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
+                       const char *var = switch_xml_attr_soft(x_param, "name");
+                       const char *val = switch_xml_attr_soft(x_param, "value");
+                       if (!strcasecmp(var, "directory-visible")) {
+                               name_visible = switch_true(val);
+                       }
+                       if (!strcasecmp(var, "directory-exten-visible")) {
+                               exten_visible = switch_true(val);
+                       }
+
+               }
+       }
+       /* Check all the user variables */
+       if ((x_vars = switch_xml_child(ut, "variables"))) {
+               for (x_var = switch_xml_child(x_vars, "variable"); x_var; x_var = x_var->next) {
+                       const char *var = switch_xml_attr_soft(x_var, "name");
+                       const char *val = switch_xml_attr_soft(x_var, "value");
+                       if (!strcasecmp(var, "effective_caller_id_name")) {
+                               caller_name = switch_core_session_strdup(session, val);
+                       }
+                       if (!strcasecmp(var, "directory_full_name")) {
+                               caller_name_override = switch_core_session_strdup(session, val);
+                       }
+               }
+       }
+       if (caller_name_override) {
+               fullName = caller_name_override;
+       } else {
+               fullName = caller_name;
+       }
+       if (zstr(fullName)) {
+               goto end;
+       }
+       firstName = switch_core_session_strdup(session, fullName);
+
+       if ((lastName = strrchr(firstName, ' '))) {
+               *lastName++ = '\0';
+       } else {
+               lastName = switch_core_session_strdup(session, firstName);
+       }
+
+       /* switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "FullName %s firstName [%s] lastName [%s]\n", fullName, firstName, lastName); */
+       if (use_number_alias == SWITCH_TRUE && !zstr(number_alias)) {
+               extension = number_alias;
+       } else {
+               extension = id;
+       }
+
+       /* Generate Digits key mapping */
+       fullNameDigit = string_to_keypad_digit(fullName);
+       lastNameDigit = string_to_keypad_digit(lastName);
+       firstNameDigit = string_to_keypad_digit(firstName);
+
+       /* add user into DB */
+       sql = switch_mprintf("insert into directory_search values('%q','%q','%q','%q','%q','%q','%q','%q','%q','%d','%d')",
+                       globals.hostname, switch_core_session_get_uuid(session), extension, fullName, fullNameDigit, firstName, firstNameDigit,
+                       lastName, lastNameDigit, name_visible, exten_visible);
+
+       switch_safe_free(fullNameDigit);
+       switch_safe_free(lastNameDigit);
+       switch_safe_free(firstNameDigit);
+
+end:
+
+       return sql;
+}
 static switch_status_t populate_database(switch_core_session_t *session, dir_profile_t *profile, const char *domain_name)
 {
        switch_status_t status = SWITCH_STATUS_SUCCESS;
@@ -535,13 +621,15 @@ static switch_status_t populate_database(switch_core_session_t *session, dir_pro
        char *sql = NULL;
        char *sqlvalues = NULL;
        char *sqltmp = NULL;
+       switch_channel_t *channel = switch_core_session_get_channel(session);
+       const char *group_selection = switch_channel_get_variable(channel, "directory_group_selection");
        int count = 0;
 
        switch_xml_t xml_root = NULL, x_domain;
        switch_xml_t ut;
 
        switch_event_t *xml_params = NULL;
-       switch_xml_t group = NULL, groups = NULL, users = NULL, x_params = NULL, x_param = NULL, x_vars = NULL, x_var = NULL;
+       switch_xml_t group = NULL, groups = NULL, users = NULL;
        switch_event_create(&xml_params, SWITCH_EVENT_REQUEST_PARAMS);
        switch_assert(xml_params);
 
@@ -553,100 +641,42 @@ static switch_status_t populate_database(switch_core_session_t *session, dir_pro
 
        if ((groups = switch_xml_child(x_domain, "groups"))) {
                for (group = switch_xml_child(groups, "group"); group; group = group->next) {
+                       const char *gname = switch_xml_attr_soft(group, "name");
+
+                       if (group_selection && strcasecmp(gname, group_selection)) {
+                               continue;
+                       }
+
                        if ((users = switch_xml_child(group, "users"))) {
                                for (ut = switch_xml_child(users, "user"); ut; ut = ut->next) {
-                                       int name_visible = 1;
-                                       int exten_visible = 1;
+                                       const char *uname = switch_xml_attr_soft(ut, "id");
                                        const char *type = switch_xml_attr_soft(ut, "type");
-                                       const char *id = switch_xml_attr_soft(ut, "id");
-                                       const char *number_alias = switch_xml_attr_soft(ut, "number-alias");
-                                       const char *extension = NULL;
-                                       char *fullName = NULL;
-                                       char *caller_name = NULL;
-                                       char *caller_name_override = NULL;
-                                       char *firstName = NULL;
-                                       char *lastName = NULL;
-                                       char *fullNameDigit = NULL;
-                                       char *firstNameDigit = NULL;
-                                       char *lastNameDigit = NULL;
 
                                        if (!strcasecmp(type, "pointer")) {
-                                               continue;
-                                       }
-                                       /* Check all the user params */
-                                       if ((x_params = switch_xml_child(ut, "params"))) {
-                                               for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
-                                                       const char *var = switch_xml_attr_soft(x_param, "name");
-                                                       const char *val = switch_xml_attr_soft(x_param, "value");
-                                                       if (!strcasecmp(var, "directory-visible")) {
-                                                               name_visible = switch_true(val);
-                                                       }
-                                                       if (!strcasecmp(var, "directory-exten-visible")) {
-                                                               exten_visible = switch_true(val);
-                                                       }
+                                               switch_xml_t ux;
 
+                                               if (switch_xml_locate_user_merged("id", uname, domain_name, NULL, &ux, NULL) != SWITCH_STATUS_SUCCESS) {
+                                                       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Can't find user [%s@%s] from pointer\n", uname, domain_name);
+                                               } else {
+                                                       sql = generate_sql_entry_for_user(session, ux, profile->use_number_alias);
+                                                       switch_xml_free(ux);
                                                }
-                                       }
-                                       /* Check all the user variables */
-                                       if ((x_vars = switch_xml_child(ut, "variables"))) {
-                                               for (x_var = switch_xml_child(x_vars, "variable"); x_var; x_var = x_var->next) {
-                                                       const char *var = switch_xml_attr_soft(x_var, "name");
-                                                       const char *val = switch_xml_attr_soft(x_var, "value");
-                                                       if (!strcasecmp(var, "effective_caller_id_name")) {
-                                                               caller_name = switch_core_session_strdup(session, val);
-                                                       }
-                                                       if (!strcasecmp(var, "directory_full_name")) {
-                                                               caller_name_override = switch_core_session_strdup(session, val);
-                                                       }
-                                               }
-                                       }
-                                       if (caller_name_override) {
-                                               fullName = caller_name_override;
+                                               
                                        } else {
-                                               fullName = caller_name;
+                                               sql = generate_sql_entry_for_user(session, ut, profile->use_number_alias);
                                        }
-                                       if (zstr(fullName)) {
-                                               continue;
-                                       }
-                                       firstName = switch_core_session_strdup(session, fullName);
-
-                                       if ((lastName = strrchr(firstName, ' '))) {
-                                               *lastName++ = '\0';
-                                       } else {
-                                               lastName = switch_core_session_strdup(session, firstName);
-                                       }
-
-                                       /* switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "FullName %s firstName [%s] lastName [%s]\n", fullName, firstName, lastName); */
-
-                                       /* user number-alias instead of id if profile allows it */
-                                       if (profile->use_number_alias == SWITCH_TRUE && !zstr(number_alias)) {
-                                               extension = number_alias;
-                                       } else {
-                                               extension = id;
-                                       }
-
-                                       /* Generate Digits key mapping */
-                                       fullNameDigit = string_to_keypad_digit(fullName);
-                                       lastNameDigit = string_to_keypad_digit(lastName);
-                                       firstNameDigit = string_to_keypad_digit(firstName);
 
-                                       /* add user into DB */
-                                       sql = switch_mprintf("insert into directory_search values('%q','%q','%q','%q','%q','%q','%q','%q','%q','%d','%d')",
-                                                                                globals.hostname, switch_core_session_get_uuid(session), extension, fullName, fullNameDigit, firstName, firstNameDigit,
-                                                                                lastName, lastNameDigit, name_visible, exten_visible);
-
-                                       if (sqlvalues) {
-                                               sqltmp = sqlvalues;
-                                               sqlvalues = switch_mprintf("%s;%s", sqlvalues, sql);
-                                               switch_safe_free(sqltmp);
-                                       } else {
-                                               sqlvalues = sql;
-                                               sql = NULL;
+                                       if (sql) {
+                                               if (sqlvalues) {
+                                                       sqltmp = sqlvalues;
+                                                       sqlvalues = switch_mprintf("%s;%s", sqltmp, sql);
+                                                       switch_safe_free(sqltmp);
+                                                       switch_safe_free(sql);
+                                               } else {
+                                                       sqlvalues = sql;
+                                                       sql = NULL;
+                                               }
                                        }
-                                       switch_safe_free(sql);
-                                       switch_safe_free(fullNameDigit);
-                                       switch_safe_free(lastNameDigit);
-                                       switch_safe_free(firstNameDigit);
                                        
                                        if (++count >= 100) {
                                                count = 0;
@@ -843,7 +873,7 @@ switch_status_t navigate_entrys(switch_core_session_t *session, dir_profile_t *p
                                globals.hostname, switch_core_session_get_uuid(session), (params->search_by == SEARCH_BY_LAST_NAME ? "last_name_digit" : "first_name_digit"), params->digits);
        }
 
-       sql = switch_mprintf("select count(*) from directory_search where %s", sql_where);
+       sql = switch_mprintf("select count(*) from directory_search where %s group by last_name, first_name, extension", sql_where);
 
        directory_execute_sql_callback(globals.mutex, sql, sql2str_callback, &cbt);
        switch_safe_free(sql);
@@ -870,7 +900,7 @@ switch_status_t navigate_entrys(switch_core_session_t *session, dir_profile_t *p
        memset(&listing_cbt, 0, sizeof(listing_cbt));
        listing_cbt.params = params;
 
-       sql = switch_mprintf("select extension, full_name, last_name, first_name, name_visible, exten_visible from directory_search where %s order by last_name, first_name", sql_where);
+       sql = switch_mprintf("select extension, full_name, last_name, first_name, name_visible, exten_visible from directory_search where %s group by extension, full_name, last_name, first_name, name_visible, exten_visible order by last_name, first_name", sql_where);
 
        for (cur_entry = 0; cur_entry < result_count; cur_entry++) {
                listing_cbt.index = 0;