diff --git a/debian/patches/sipwise/sw_vcs.patch b/debian/patches/sipwise/sw_vcs.patch index 7803209d..25fdd138 100644 --- a/debian/patches/sipwise/sw_vcs.patch +++ b/debian/patches/sipwise/sw_vcs.patch @@ -13,7 +13,7 @@ +include $(COREPATH)/plug-in/Makefile.app_module --- /dev/null +++ b/apps/sw_vsc/SW_Vsc.cpp -@@ -0,0 +1,1688 @@ +@@ -0,0 +1,1757 @@ +#include +using namespace pcrecpp; + @@ -33,7 +33,7 @@ +#define SW_VSC_DATABASE "provisioning" + +#define SW_VSC_GET_ATTRIBUTE_ID "select id from voip_preferences where attribute='%s'" -+#define SW_VSC_GET_SUBSCRIBER_ID "select s.id, d.domain, d.id "\ ++#define SW_VSC_GET_SUBSCRIBER_ID "select s.id, d.domain, d.id, s.profile_id "\ + "from voip_subscribers s, voip_domains d "\ + "where s.uuid='%s' and s.domain_id = d.id" +#define SW_VSC_GET_PREFERENCE_ID "select id,value from voip_usr_preferences where subscriber_id=%llu " \ @@ -80,6 +80,9 @@ + "(subscriber_id, type, destination_set_id, time_set_id) "\ + "values(%llu, '%s', %llu, NULL)" + ++#define SW_VSC_GET_SUBPROFILE_ATTRIBUTE "select id from voip_subscriber_profile_attributes "\ ++ "where profile_id=%llu and attribute_id=%llu" ++ +#define SW_VSC_DESTSET_CFU "cfu_by_vsc" +#define SW_VSC_DESTSET_CFB "cfb_by_vsc" +#define SW_VSC_DESTSET_CFT "cft_by_vsc" @@ -506,8 +509,45 @@ + return id; +} + ++int SW_VscDialog::checkSubscriberProfile(MYSQL *my_handler, u_int64_t profileId, u_int64_t attributeId) ++{ ++ MYSQL_RES *res; ++ MYSQL_ROW row; ++ char query[1024] = ""; ++ int ret = 0; ++ ++ // if no profile is set, allow by default ++ if(profileId == 0) ++ { ++ INFO("Allow preference due to unset subscriber profile"); ++ return 1; ++ } ++ ++ snprintf(query, sizeof(query), SW_VSC_GET_SUBPROFILE_ATTRIBUTE, profileId, attributeId); ++ ++ if (mysql_real_query(my_handler, query, strlen(query)) != 0) ++ { ++ ERROR("Error checking profile attributes for profile '%llu' and attribute %llu: %s", ++ profileId, attributeId, mysql_error(my_handler)); ++ return 0; ++ } ++ ++ res = mysql_store_result(my_handler); ++ if (mysql_num_rows(res) >= 1) ++ { ++ INFO("Allow preference attribute %llu as it is in profile %llu", attributeId, profileId); ++ ret = 1; ++ } ++ else ++ { ++ INFO("Reject preference attribute %llu as it is not in profile %llu", attributeId, profileId); ++ ret = 0; ++ } ++ return ret; ++} ++ +u_int64_t SW_VscDialog::getSubscriberId(MYSQL *my_handler, const char *uuid, -+ string *domain, u_int64_t &domain_id) ++ string *domain, u_int64_t &domain_id, u_int64_t &profile_id) +{ + MYSQL_RES *res; + MYSQL_ROW row; @@ -542,6 +582,7 @@ + domain->clear(); + *domain += string(row[1]); + domain_id = atoll(row[2]); ++ profile_id = row[3] == NULL ? 0 : atoll(row[3]); + mysql_free_result(res); + return id; +} @@ -1009,7 +1050,7 @@ + MYSQL *my_handler = NULL; + my_bool recon = 1; + -+ u_int64_t subId, domId; ++ u_int64_t subId, domId, profId; + string domain, uri; + char map_str[128] = ""; + string mapStr, prefStr; @@ -1043,7 +1084,7 @@ + goto out; + } + -+ subId = getSubscriberId(my_handler, uuid.c_str(), &domain, domId); ++ subId = getSubscriberId(my_handler, uuid.c_str(), &domain, domId, profId); + if (!subId) + { + filename = m_patterns->failAnnouncement; @@ -1081,6 +1122,13 @@ + filename = m_patterns->failAnnouncement; + goto out; + } ++ ++ if(!checkSubscriberProfile(my_handler, profId, attId)) ++ { ++ filename = m_patterns->failAnnouncement; ++ goto out; ++ } ++ + u_int64_t prefId = getPreference(my_handler, subId, attId, + &foundPref, &prefStr); + if (!prefId) @@ -1190,6 +1238,13 @@ + filename = m_patterns->failAnnouncement; + goto out; + } ++ ++ if(!checkSubscriberProfile(my_handler, profId, attId)) ++ { ++ filename = m_patterns->failAnnouncement; ++ goto out; ++ } ++ + u_int64_t prefId = getPreference(my_handler, subId, attId, + &foundPref, &prefStr); + if (!prefId) @@ -1305,6 +1360,13 @@ + filename = m_patterns->failAnnouncement; + goto out; + } ++ ++ if(!checkSubscriberProfile(my_handler, profId, attId)) ++ { ++ filename = m_patterns->failAnnouncement; ++ goto out; ++ } ++ + u_int64_t prefId = getPreference(my_handler, subId, attId, + &foundPref, &prefStr); + if (!prefId) @@ -1472,6 +1534,13 @@ + filename = m_patterns->failAnnouncement; + goto out; + } ++ ++ if(!checkSubscriberProfile(my_handler, profId, attId)) ++ { ++ filename = m_patterns->failAnnouncement; ++ goto out; ++ } ++ + u_int64_t prefId = getPreference(my_handler, subId, attId, + &foundPref, &prefStr); + if (!prefId) @@ -1704,7 +1773,7 @@ +} --- /dev/null +++ b/apps/sw_vsc/SW_Vsc.h -@@ -0,0 +1,130 @@ +@@ -0,0 +1,131 @@ +#ifndef _SW_VSC_H_ +#define _SW_VSC_H_ + @@ -1798,7 +1867,7 @@ + + u_int64_t getAttributeId(MYSQL *my_handler, const char *attribute); + u_int64_t getSubscriberId(MYSQL *my_handler, const char *uuid, -+ string *domain, u_int64_t &domain_id); ++ string *domain, u_int64_t &domain_id, u_int64_t &profile_id); + u_int64_t getPreference(MYSQL *my_handler, u_int64_t subscriberId, u_int64_t attributeId, + int *foundPref, string *value); + int deletePreferenceId(MYSQL *my_handler, u_int64_t preferenceId); @@ -1810,6 +1879,7 @@ + int deleteReminder(MYSQL *my_handler, u_int64_t subscriberId); + int number2uri(const AmSipRequest &req, MYSQL *my_handler, string &uuid, u_int64_t subId, + string &domain, u_int64_t domId, int offset, string &uri); ++ int checkSubscriberProfile(MYSQL *my_handler, u_int64_t profileId, u_int64_t attributeId); + u_int64_t createCFMap(MYSQL *my_handler, u_int64_t subscriberId, string &uri, + const char *mapName, const char *type); + u_int64_t deleteCFMap(MYSQL *my_handler, u_int64_t subscriberId,