Module: sip-router
Branch: master
Commit: 8d649d042d43c4dc29b2cb747ba87c1f75590713
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=8d649d0…
Author: Anca Vamanu <anca.vamanu(a)1and1.ro>
Committer: Anca Vamanu <anca.vamanu(a)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 )
{