Module: sip-router Branch: master Commit: 8d649d042d43c4dc29b2cb747ba87c1f75590713 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=8d649d04...
Author: Anca Vamanu anca.vamanu@1and1.ro Committer: Anca Vamanu anca.vamanu@1and1.ro Date: Wed Jun 27 18:34:55 2012 +0300
modules_k/presence_xml Xcap auth reason when user deleted from list
The reason in Subscription-Status header in Notify when a user is deleted from the contact list can be decided by the admin by setting presence_xml module parameter xcapauth_usedel_reason. Default value is "probation". (cherry picked from commit 3abf967f61a1bd95c28d4e8a929a8bd5df00671d)
---
modules_k/presence/presence.c | 10 +--- modules_k/presence_xml/README | 32 +++++++++++-- modules_k/presence_xml/doc/presence_xml_admin.xml | 29 +++++++++++ modules_k/presence_xml/presence_xml.c | 4 ++ modules_k/presence_xml/xcap_auth.c | 55 ++++++++++++--------- 5 files changed, 94 insertions(+), 36 deletions(-)
diff --git a/modules_k/presence/presence.c b/modules_k/presence/presence.c index 95a7127..29470bc 100644 --- a/modules_k/presence/presence.c +++ b/modules_k/presence/presence.c @@ -828,17 +828,9 @@ int pres_update_status(subs_t subs, str reason, db_key_t* query_cols, query_vals[q_wuser_col].val.str_val= subs.watcher_user; query_vals[q_wdomain_col].val.str_val= subs.watcher_domain;
- /* if status is no longer ACTIVE, switch to terminated */ - if(subs.status!=status && status==ACTIVE_STATUS) - { - subs.status = TERMINATED_STATUS; - subs.reason.s = get_status_str(TERMINATED_STATUS); - subs.reason.len = strlen(subs.reason.s); - } - update_vals[u_status_col].val.int_val= subs.status; update_vals[u_reason_col].val.str_val= subs.reason; - + if (pa_dbf.use_table(pa_db, &watchers_table) < 0) { LM_ERR( "in use_table\n"); diff --git a/modules_k/presence_xml/README b/modules_k/presence_xml/README index 3f2d281..e42dbed 100644 --- a/modules_k/presence_xml/README +++ b/modules_k/presence_xml/README @@ -32,6 +32,7 @@ Anca-Maria Vamanu 3.7. integrated_xcap_server (int) 3.8. xcap_server (str) 3.9. passive_mode(int) + 3.10. xcapauth_userdel_reason(str)
4. Functions
@@ -54,8 +55,9 @@ Anca-Maria Vamanu 1.7. Set integrated_xcap_server parameter 1.8. Set xcap_server parameter 1.9. Set passive_mode parameter - 1.10. pres_check_basic usage - 1.11. pres_check_activities usage + 1.10. Set xcapauth_userdel_reason parameter + 1.11. pres_check_basic usage + 1.12. pres_check_activities usage
Chapter 1. Admin Guide
@@ -78,6 +80,7 @@ Chapter 1. Admin Guide 3.7. integrated_xcap_server (int) 3.8. xcap_server (str) 3.9. passive_mode(int) + 3.10. xcapauth_userdel_reason(str)
4. Functions
@@ -135,6 +138,7 @@ Chapter 1. Admin Guide 3.7. integrated_xcap_server (int) 3.8. xcap_server (str) 3.9. passive_mode(int) + 3.10. xcapauth_userdel_reason(str)
3.1. db_url(str)
@@ -260,6 +264,26 @@ modparam("presence_xml", "xcap_server", "xcap_server.ag.org") modparam("presence_xml", "passive_mode", 1) ...
+3.10. xcapauth_userdel_reason(str) + + This parameter represents the reason that will be included in the + Subscription-State header of the Notify when a rule is no longer found + in the XCAP pres-auth document for a user that was previously allowed. + The Subscription state in this case switches to "terminated". Because + it is not clear which reason is most appropriate in this case from the + ones defined by the RFC 3265, this parameter offers the possibility for + the admin to decide which one he wishes to use. + + Default value: “probation” . Since probation also accepts a retry-after + parameter to specify after at least how may seconds the client should + reattempt to resubscribe, you can include this in the parameter also. + + Example 1.10. Set xcapauth_userdel_reason parameter +... +modparam("presence_xml", "xcapauth_userdel_reason", "probation;retry-after=30") +modparam("presence_xml", "xcapauth_userdel_reason", "rejected") +... + 4. Functions
4.1. pres_check_basic(presentity_uri, status) @@ -276,7 +300,7 @@ modparam("presence_xml", "passive_mode", 1) * 1 - if a match is found. * -1 - if a match is not found.
- Example 1.10. pres_check_basic usage + Example 1.11. pres_check_basic usage ... if (pres_check_basic("$ru", "open")) { ... @@ -300,7 +324,7 @@ modparam("presence_xml", "passive_mode", 1) * -1 - if a match is not found. * -2 - if /presence/person or /presence/person/activity do not exist.
- Example 1.11. pres_check_activities usage + Example 1.12. pres_check_activities usage ... if (pres_check_basic("$ru", "open")) { pres_check_activities("$ru", "unknown"); diff --git a/modules_k/presence_xml/doc/presence_xml_admin.xml b/modules_k/presence_xml/doc/presence_xml_admin.xml index 69252a5..57b4f26 100644 --- a/modules_k/presence_xml/doc/presence_xml_admin.xml +++ b/modules_k/presence_xml/doc/presence_xml_admin.xml @@ -288,8 +288,37 @@ modparam("presence_xml", "passive_mode", 1) </programlisting> </example> </section> + + <section> + <title><varname>xcapauth_userdel_reason</varname>(str)</title> + <para> + This parameter represents the reason that will be included in the + Subscription-State header of the Notify when a rule is no longer found + in the XCAP pres-auth document for a user that was previously allowed. + The Subscription state in this case switches to "terminated". Because + it is not clear which reason is most appropriate in this case from + the ones defined by the RFC 3265, this parameter offers the possibility + for the admin to decide which one he wishes to use. + </para> + <para> + <emphasis>Default value: <quote>probation</quote> </emphasis> . Since + probation also accepts a retry-after parameter to specify after at + least how may seconds the client should reattempt to resubscribe, + you can include this in the parameter also. + </para> + <example> + <title>Set <varname>xcapauth_userdel_reason</varname> parameter</title> + <programlisting format="linespecific"> +... +modparam("presence_xml", "xcapauth_userdel_reason", "probation;retry-after=30") +modparam("presence_xml", "xcapauth_userdel_reason", "rejected") +... +</programlisting> + </example> + </section> </section>
+ <section> <title>Functions</title> <section> diff --git a/modules_k/presence_xml/presence_xml.c b/modules_k/presence_xml/presence_xml.c index 52b4e60..45fcbd5 100644 --- a/modules_k/presence_xml/presence_xml.c +++ b/modules_k/presence_xml/presence_xml.c @@ -94,6 +94,7 @@ int disable_presence = 0; int disable_winfo = 0; int disable_bla = 1; int passive_mode = 0; +str xcapauth_userdel_reason = str_init("probation");
/** SL API structure */ sl_api_t slb; @@ -126,6 +127,7 @@ static param_export_t params[]={ { "disable_winfo", INT_PARAM, &disable_winfo }, { "disable_bla", INT_PARAM, &disable_bla }, { "passive_mode", INT_PARAM, &passive_mode }, + { "xcapauth_userdel_reason", STR_PARAM, &xcapauth_userdel_reason.s}, { 0, 0, 0} };
@@ -168,6 +170,8 @@ static int mod_init(void) return -1; }
+ xcapauth_userdel_reason.len = strlen(xcapauth_userdel_reason.s); + db_url.len = db_url.s ? strlen(db_url.s) : 0; LM_DBG("db_url=%s/%d/%p\n",ZSW(db_url.s),db_url.len, db_url.s); xcap_table.len = xcap_table.s ? strlen(xcap_table.s) : 0; diff --git a/modules_k/presence_xml/xcap_auth.c b/modules_k/presence_xml/xcap_auth.c index 4492170..ad2603d 100644 --- a/modules_k/presence_xml/xcap_auth.c +++ b/modules_k/presence_xml/xcap_auth.c @@ -47,6 +47,8 @@ #include "xcap_auth.h" #include "pidf.h"
+extern str xcapauth_userdel_reason; + int http_get_rules_doc(str user, str domain, str* rules_doc);
int pres_watcher_allowed(subs_t* subs) @@ -55,7 +57,8 @@ int pres_watcher_allowed(subs_t* subs) xmlNodePtr node= NULL, actions_node = NULL; xmlNodePtr sub_handling_node = NULL; char* sub_handling = NULL; - + int ret = 0; + /* if force_active set status to active*/ if(force_active) { @@ -64,12 +67,12 @@ int pres_watcher_allowed(subs_t* subs) subs->reason.len= 0; return 0; } - subs->status= PENDING_STATUS; - subs->reason.s= NULL; - subs->reason.len= 0;
if(subs->auth_rules_doc== NULL) { + subs->status= PENDING_STATUS; + subs->reason.s= NULL; + subs->reason.len= 0; return 0; }
@@ -84,27 +87,35 @@ int pres_watcher_allowed(subs_t* subs) node= get_rule_node(subs, xcap_tree); if(node== NULL) { - xmlFreeDoc(xcap_tree); - return 0; + /* if no rule node was found and the previous state was active -> set the + * state to terminated with reason xcapauth_userdel_reason (default "probation") */ + if(subs->status != PENDING_STATUS) + { + subs->status= TERMINATED_STATUS; + subs->reason= xcapauth_userdel_reason; + } + goto done; }
- /* process actions */ + subs->status= PENDING_STATUS; + subs->reason.s= NULL; + subs->reason.len= 0; + + /* process actions */ actions_node = xmlNodeGetChildByName(node, "actions"); if(actions_node == NULL) - { + { LM_DBG("actions_node NULL\n"); - xmlFreeDoc(xcap_tree); - return 0; + goto done; } LM_DBG("actions_node->name= %s\n", actions_node->name); sub_handling_node = xmlNodeGetChildByName(actions_node, "sub-handling"); if(sub_handling_node== NULL) - { + { LM_DBG("sub_handling_node NULL\n"); - xmlFreeDoc(xcap_tree); - return 0; + goto done; } sub_handling = (char*)xmlNodeGetContent(sub_handling_node); LM_DBG("sub_handling_node->name= %s\n", @@ -115,8 +126,8 @@ int pres_watcher_allowed(subs_t* subs) if(sub_handling== NULL) { LM_ERR("Couldn't get sub-handling content\n"); - xmlFreeDoc(xcap_tree); - return -1; + ret = -1; + goto done; } if( strncmp((char*)sub_handling, "block",5 )==0) { @@ -140,21 +151,19 @@ int pres_watcher_allowed(subs_t* subs) if( strncmp((char*)sub_handling , "allow",5 )==0) { subs->status = ACTIVE_STATUS; - subs->reason.s = NULL; } else { LM_ERR("unknown subscription handling action\n"); - xmlFree(sub_handling); - xmlFreeDoc(xcap_tree); - return -1; + ret = -1; }
- xmlFree(sub_handling); +done: + if(sub_handling) + xmlFree(sub_handling); xmlFreeDoc(xcap_tree); - return 0; - -} + return ret; +}
xmlNodePtr get_rule_node(subs_t* subs, xmlDocPtr xcap_tree ) {