Module: sip-router
Branch: master
Commit: c4a4a94065374fd182fc13374a0c520afa410f45
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c4a4a94…
Author: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Date: Wed Apr 18 17:18:45 2012 +0100
modules_k/rls: srand() called frequently
- srand() was used to ensure that the instance IDs for use in
RLS NOTIFY bodies were random, but consistent.
- The instance ID needs to be unique within a resource node in the
NOTIFY body. It does not have to be unique locally. Although
it needs to be unique it also needs to be repeatable as the same
resource instance needs the same ID in subsequent NOTIFY requests.
- You will only get multiple instances for a resource when the
back-end SUBSCRIBEs from RLS are forked. Kamailio does not support
this at the moment (the callback function in pua/send_subscribe.c
is only called for the first final response) so we will only ever
have one instance per resource.
- Because there is only one instance per resource the instance ID
can just be a fixed string. This will need to be changed if/when
forking of back-end SUBSCRIBEs from PUA is supported.
---
modules_k/rls/notify.c | 74 +++++++++++++++++++++------------------
modules_k/rls/notify.h | 4 ++-
modules_k/rls/resource_notify.c | 18 +++++++---
3 files changed, 56 insertions(+), 40 deletions(-)
diff --git a/modules_k/rls/notify.c b/modules_k/rls/notify.c
index d4d0247..4a4b2da 100644
--- a/modules_k/rls/notify.c
+++ b/modules_k/rls/notify.c
@@ -83,6 +83,8 @@ int rls_get_resource_list(str *rl_uri, str *username, str *domain,
int add_resource_to_list(char* uri, void* param);
int add_resource(char* uri, xmlNodePtr list_node, char * boundary_string, db1_res_t *result, int *len_est);
+char *instance_id = "Scf8UhwQ";
+
int send_full_notify(subs_t* subs, xmlNodePtr rl_node, str* rl_uri,
unsigned int hash_code)
{
@@ -165,7 +167,7 @@ int send_full_notify(subs_t* subs, xmlNodePtr rl_node, str* rl_uri,
goto error;
}
- boundary_string= generate_string((int)time(NULL), BOUNDARY_STRING_LEN);
+ boundary_string= generate_string(BOUNDARY_STRING_LEN);
while (uri_list_head)
{
@@ -383,12 +385,11 @@ int add_resource_instance(char* uri, xmlNodePtr resource_node,
db_val_t *row_vals;
int i, cmp_code;
char* auth_state= NULL;
- int contor= 0;
int auth_state_flag;
- int boundary_len = strlen(boundary_string);
- str cid;
- str content_type= {0, 0};
- str body= {0, 0};
+ int boundary_len = strlen(boundary_string);
+ str cid;
+ str content_type= {0, 0};
+ str body= {0, 0};
for(i= 0; i< result->n; i++)
{
@@ -402,8 +403,6 @@ int add_resource_instance(char* uri, xmlNodePtr resource_node,
if(cmp_code== 0)
{
- contor++;
-
auth_state_flag= row_vals[auth_state_col].val.int_val;
auth_state= get_auth_string(auth_state_flag );
if(auth_state== NULL)
@@ -411,17 +410,17 @@ int add_resource_instance(char* uri, xmlNodePtr resource_node,
LM_ERR("bad authorization status flag\n");
goto error;
}
- *len_est += strlen(auth_state) + 38; /* <instance id="12345678" state="[auth_state]" />r/n */
+ *len_est += strlen(auth_state) + 38; /* <instance id="12345678" state="[auth_state]" />r/n */
if(auth_state_flag & ACTIVE_STATE)
{
cid.s= generate_cid(uri, strlen(uri));
cid.len= strlen(cid.s);
- body.s= (char*)row_vals[pres_state_col].val.string_val;
- body.len= strlen(body.s);
- trim(&body);
+ body.s= (char*)row_vals[pres_state_col].val.string_val;
+ body.len= strlen(body.s);
+ trim(&body);
- *len_est += cid.len + 8; /* cid="[cid]" */
+ *len_est += cid.len + 8; /* cid="[cid]" */
content_type.s = (char*)row_vals[content_type_col].val.string_val;
content_type.len = strlen(content_type.s);
*len_est += 4 + boundary_len
@@ -430,18 +429,17 @@ int add_resource_instance(char* uri, xmlNodePtr resource_node,
+ 18 + content_type.len
+ 4 + body.len + 8;
}
- else
- if(auth_state_flag & TERMINATED_STATE)
- {
- *len_est += strlen(row_vals[resource_uri_col].val.string_val) + 10; /* reason="[resaon]" */
+ else if(auth_state_flag & TERMINATED_STATE)
+ {
+ *len_est += strlen(row_vals[resource_uri_col].val.string_val) + 10; /* reason="[resaon]" */
}
- if (rls_max_notify_body_len > 0 && *len_est > rls_max_notify_body_len)
- {
- /* We have a limit on body length set, and we were about to exceed it */
- return *len_est;
+ if (rls_max_notify_body_len > 0 && *len_est > rls_max_notify_body_len)
+ {
+ /* We have a limit on body length set, and we were about to exceed it */
+ return *len_est;
}
- instance_node= xmlNewChild(resource_node, NULL,
+ instance_node= xmlNewChild(resource_node, NULL,
BAD_CAST "instance", NULL);
if(instance_node== NULL)
{
@@ -449,15 +447,24 @@ int add_resource_instance(char* uri, xmlNodePtr resource_node,
goto error;
}
- /* OK, we are happy this will fit */
+ /* OK, we are happy this will fit */
+ /* Instance ID should be unique for each instance node
+ within a resource node. The same instance ID can be
+ used in different resource nodes. Instance ID needs
+ to remain the same for each resource instance in
+ future updates. We can just use a common string
+ here because you will only get multiple instances
+ for a resource when the back-end SUBSCRIBE is forked
+ and pua does not support this. If/when pua supports
+ forking of the SUBSCRIBEs it sends this will need to
+ be fixed properly. */
xmlNewProp(instance_node, BAD_CAST "id",
- BAD_CAST generate_string(contor, 8));
+ BAD_CAST instance_id);
xmlNewProp(instance_node, BAD_CAST "state", BAD_CAST auth_state);
if(auth_state_flag & ACTIVE_STATE)
{
- constr_multipart_body (&content_type, &body, &cid, boundary_len, boundary_string);
-
+ constr_multipart_body (&content_type, &body, &cid, boundary_len, boundary_string);
xmlNewProp(instance_node, BAD_CAST "cid", BAD_CAST cid.s);
}
else
@@ -1059,26 +1066,25 @@ int process_list_and_exec(xmlNodePtr list_node, str username, str domain,
return res;
}
-char* generate_string(int seed, int length)
+char* generate_string(int length)
{
static char buf[128];
- int r,i;
+ int r,i;
- if(length>= 128)
+ if(length>= 128)
{
LM_ERR("requested length exceeds buffer size\n");
return NULL;
}
- srand(seed);
for(i=0; i<length; i++)
{
r= rand() % ('z'- 'A') + 'A';
- if(r>'Z' && r< 'a')
- r= '0'+ (r- 'Z');
+ if(r>'Z' && r< 'a')
+ r= '0'+ (r- 'Z');
- sprintf(buf+i, "%c", r);
- }
+ sprintf(buf+i, "%c", r);
+ }
buf[length]= '\0';
return buf;
diff --git a/modules_k/rls/notify.h b/modules_k/rls/notify.h
index c5c2ac4..04a3e80 100644
--- a/modules_k/rls/notify.h
+++ b/modules_k/rls/notify.h
@@ -53,11 +53,13 @@ typedef int (*list_func_t)(char* uri, void* param);
int process_list_and_exec(xmlNodePtr list, str username, str domain,
list_func_t function, void* param);
-char* generate_string(int seed, int length);
+char* generate_string(int length);
char* generate_cid(char* uri, int uri_len);
char* get_auth_string(int flag);
int agg_body_sendn_update(str* rl_uri, char* boundary_string, str* rlmi_body,
str* multipart_body, subs_t* subs, unsigned int hash_code);
int rls_send_notify(subs_t* subs,str* body,char* start_cid,char* boundary_string);
int create_empty_rlmi_doc(xmlDocPtr *rlmi_doc, xmlNodePtr *list_node, str *uri, int version, int full_state);
+
+extern char *instance_id;
#endif
diff --git a/modules_k/rls/resource_notify.c b/modules_k/rls/resource_notify.c
index b9fbf94..99478c9 100644
--- a/modules_k/rls/resource_notify.c
+++ b/modules_k/rls/resource_notify.c
@@ -177,7 +177,7 @@ static void send_notifies(db1_res_t *result, int did_col, int resource_uri_col,
char* buf= NULL, *auth_state= NULL, *boundary_string= NULL;
str cid = {0,0};
str content_type= {0, 0};
- int contor= 0, auth_state_flag;
+ int auth_state_flag;
int chunk_len=0;
str bstr= {0, 0};
subs_t* dialog= NULL;
@@ -185,7 +185,7 @@ static void send_notifies(db1_res_t *result, int did_col, int resource_uri_col,
int resource_added = 0; /* Flag to indicate that we have added at least one resource */
/* generate the boundary string */
- boundary_string= generate_string((int)time(NULL), BOUNDARY_STRING_LEN);
+ boundary_string= generate_string(BOUNDARY_STRING_LEN);
bstr.len= strlen(boundary_string);
bstr.s= (char*)pkg_malloc((bstr.len+ 1)* sizeof(char));
if(bstr.s== NULL)
@@ -267,10 +267,8 @@ static void send_notifies(db1_res_t *result, int did_col, int resource_uri_col,
/* there might be more records with the same uri- more instances-
* search and add them all */
- contor= 0;
while(1)
{
- contor++;
cid.s= NULL;
cid.len= 0;
@@ -336,8 +334,18 @@ static void send_notifies(db1_res_t *result, int did_col, int resource_uri_col,
goto error;
}
+ /* Instance ID should be unique for each instance node
+ within a resource node. The same instance ID can be
+ used in different resource nodes. Instance ID needs
+ to remain the same for each resource instance in
+ future updates. We can just use a common string
+ here because you will only get multiple instances
+ for a resource when the back-end SUBSCRIBE is forked
+ and pua does not support this. If/when pua supports
+ forking of the SUBSCRIBEs it sends this will need to
+ be fixed properly. */
xmlNewProp(instance_node, BAD_CAST "id",
- BAD_CAST generate_string(contor, 8));
+ BAD_CAST instance_id);
if(auth_state_flag & ACTIVE_STATE)
{
xmlNewProp(instance_node, BAD_CAST "state", BAD_CAST auth_state);
Hi everybody, I'm doing my final project of my bachlor degree!
I use in a virtual machine Kamailio 3.1.3 within realtime Asterisk 1.6.13!
I have to use tLS, done! An other part of my final project is to make a
filter on the medias in the SDP .
Well, so like m= video, audio, application.. This filter has to be
retrieved in Siremis!
So, in Siremis, I have to put the filter in case of the media for the
different subscribers and connections in/out of the SBC
Can you give me your different opinions about that, how to make it,
possibilities? where in the code I have to make this filter??
parser/sdp/sdp.c ?? ..
Thanks in advance
Best regards
--
*Grégoire Vandendeurpel, *
*
*
*IT Sector*
THIS IS AN AUTOMATED MESSAGE, DO NOT REPLY.
The following task has a new comment added:
FS#215 - Kamailio 3.2.2 fails to compile due to references to curl/types.h
User who did this - Daniel-Constantin Mierla (miconda)
----------
Which version of curl library has the curl/types.h removed? In some systems the file is there, perhaps they distribute older version. Is it a compile time define to detect the versions without the file?
Grepping for this file, I found it in modules/auth_identity, have you found it in other places? What are the compile errors you get?
----------
More information can be found at the following URL:
http://sip-router.org/tracker/index.php?do=details&task_id=215#comment517
You are receiving this message because you have requested it from the Flyspray bugtracking system. If you did not expect this message or don't want to receive mails in future, you can change your notification settings at the URL shown above.
THIS IS AN AUTOMATED MESSAGE, DO NOT REPLY.
A new Flyspray task has been opened. Details are below.
User who did this - Jeroen van Bemmel (jbemmel)
Attached to Project - sip-router
Summary - Kamailio 3.2.2 fails to compile due to references to curl/types.h
Task Type - Bug Report
Category - Core
Status - Assigned
Assigned To - Andrei Pelinescu-Onciul
Operating System - All
Severity - Low
Priority - Normal
Reported Version - Development
Due in Version - Undecided
Due Date - Undecided
Details - See http://curl.haxx.se/mail/tracker-2011-07/0011.html - curl/types.h was recently removed. Various files in Kamailio still #include this file; to fix, simply remove the #include line
More information can be found at the following URL:
http://sip-router.org/tracker/index.php?do=details&task_id=215
You are receiving this message because you have requested it from the Flyspray bugtracking system. If you did not expect this message or don't want to receive mails in future, you can change your notification settings at the URL shown above.
THIS IS AN AUTOMATED MESSAGE, DO NOT REPLY.
A user has added themself to the list of users assigned to this task.
FS#215 - Kamailio 3.2.2 fails to compile due to references to curl/types.h
User who did this - Jeroen van Bemmel (jbemmel)
http://sip-router.org/tracker/index.php?do=details&task_id=215
You are receiving this message because you have requested it from the Flyspray bugtracking system. If you did not expect this message or don't want to receive mails in future, you can change your notification settings at the URL shown above.
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7c4be46…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Tue Apr 17 23:00:50 2012 +0200
pua_reginfo: propoer call-id buffer when constructing XML for reginfo
- patch by Stefan Sayer, FS#212
(cherry picked from commit db07a8e381990d835711e978a5bf711186495cdf)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0f9f9c8…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Tue Apr 17 22:55:35 2012 +0200
pua_reginfo: fix for state of the registration during unregister
- when unregistering a single contact, the state of the registration may
be incorrectly reported .
- fix of a small inefficiency of repeatedly calling time(2) in the same function.
- patch by Stefan Sayer, FS#213
(cherry picked from commit c4be935b40b23b87b321fd604e761332bb07b8f8)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=f269211…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Tue Apr 17 22:40:06 2012 +0200
maxfwd(k): return -2 (false) if MF header cannot be processed
- reported by Ladislav Jurak, FS#214
(cherry picked from commit a15428e688049e7ef49174a2e24cbf49eb7a7cad)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b5b0b15…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Mon Apr 16 14:03:14 2012 +0200
debugger: safe wrapper around cfg name
- some actions can be executed from inside the code, with no cfg file
name attached to it -- that makes debugger crash on solaris while
printing executed action details
- reported by Nathaniel
(cherry picked from commit 40ddcf88df9ef71bba7c182b7a1d76b559645628)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=78a67d3…
Author: Alexandr Dubovikov <alexandr.dubovikov(a)gmail.com>
Date: Tue Apr 3 13:10:37 2012 +0200
modules_k/siptrace: Fixed \0 termination for tmp_pipport.
Thanks Michal Karas for the patch.
(cherry picked from commit d5fbc4ead58c7ef47aba91238c74f40f9162f78d)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=66241f5…
Author: Miklos Tirpak <miklos(a)iptel.org>
Date: Thu Mar 29 10:45:02 2012 +0200
tm: fix the multiple t_suspend+t_continue scenario
When t_suspend() was called in the route block executed
by t_continue(), the function did not recognize the newly
added blind UAC and claimed that there is no new branch added.
This resulted in the transaction being killed by t_continue().
(cherry picked from commit 9ae149ba25ee6467da1d95dd435995b9a59166a3)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7efc191…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Tue Mar 27 13:56:32 2012 +0200
core: include str.h in parse_param.h to avoid compile errors
- it happened when parse_param.h is used first, alone or without any
predecessors including str.h
(cherry picked from commit 8194dfe8f45f688bb9b5332ecdc66ec1423ca77f)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=6251a0a…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Wed Mar 14 10:57:47 2012 +0100
parser/sdp: allow boundary value between quotes
- reported by Magnus Nordström, FS#200
(cherry picked from commit a66242b4f776b43120014b0c56e21c87d254ddcc)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=79b46b9…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Wed Mar 14 10:01:00 2012 +0100
sqlops: check for DB_CAP_RAW_QUERY of DB connection
- the module is using raw query capability and DB_CAP_ALL does not
include it
- reported by Pedro Vico, FS#208
(cherry picked from commit edc4d902135d484d02272a64b7f27447fcb6854e)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=e139846…
Author: Alexandr Dubovikov <alexandr.dubovikov(a)gmail.com>
Date: Wed Mar 14 09:29:24 2012 +0100
modules/sipcapture: added check for corrupted and defragmented packets
(cherry picked from commit cb8c24f1ef873d16fd5c7edd96e2c0d3847b3dda)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=5114ed7…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Mon Mar 12 17:04:17 2012 +0100
call_control: avoid internal flags conflicts with mediaproxy
- use internal flag 28 for marking requests handled by call_control, the
old value, 30, being used by mediaproxy module, resulting in engaging
media relay
- reported and solution by Reda Aouad
(cherry picked from commit 55812477d1f4c9ee8726d0ba3cc7b6d3c8835f8a)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=8fe8547…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Fri Mar 9 19:12:59 2012 +0100
dns: srv load balancing distribution fix
The load distribution when doing SRV based load balancing was not
completely fair. The first listed server had always an extra
(sum_of_weights-weight)/(sum_of_weights*(sum_of_weights+1) chance
of being selected.
For example for 2 servers both with weight 50, the first one
will have an extra (100-50)/100*101 change of being selected =>
extra 0.495% which gives a 50.495% - 49.505% distribution
instead of 50% - 50%. For large weight values this doesn't make a big
difference (e.g. for 500-500 => 50.049% instead of 50%) but for
small values it becomes very noticeable (e.g. for 1-1 =>
66% - 33% distribution instead of 50%-50%).
The chance of selecting a 0-weight record was also changed. It was
1/(sum_of_weights+1) and now is 1/(sum_of_weights*1000).
Reported-by: Michal Matyska michal.matyska iptel org
(cherry picked from commit d8fe0def83736c204dd1eace89e8ca1823704fc3)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=709c749…
Author: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Date: Tue Mar 6 18:10:13 2012 +0000
modules/tm: Filled in the $snd() structure for event_route[tm:local-request]
(cherry picked from commit 43e7274cad12535fc20d0e669d87939c1c18f399)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=13b5952…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Sat Mar 3 12:34:38 2012 +0100
uac(k): support for 407 challenge to registrations
- requested in FS#204, by Oded Resnik
(cherry picked from commit 2ac96ebcc173a2f1e601b38afa5c9bba5de8c0b5)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=9f5a8ac…
Author: Alexandr Dubovikov <alexandr.dubovikov(a)gmail.com>
Date: Mon Mar 5 11:56:50 2012 +0100
module: modules/sipcapture fixed socket_info structure.
Now users can use $Ri, $rp variables in RAW socket mode.
(cherry picked from commit f9494494d59d2036f2ed664fbdf4193760662937)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=48d0266…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Wed Feb 29 19:08:31 2012 +0100
kamailio.cfg: add colon before the port for voicemail server
(cherry picked from commit 0e3f1ff9507a578d95d02d615d333ef24fe42d87)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ab20bfc…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Fri Feb 24 10:24:29 2012 +0100
tls: check for support of ssl2
- latest distros with newer ssl lib are removing the ssl2 support
(cherry picked from commit 7c7ed8ad9d62bd501bd2c856a01689a84a0c0711)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1ad616a…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Fri Feb 17 15:46:12 2012 +0100
ndb_redis: try to reconnect if query to redis server fails
- credits to Javier Gallart for testing
(cherry picked from commit 4a6a2cfd2df535c0f293d0d944685a702b45af0b)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=08782d2…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Thu Feb 9 15:28:44 2012 +0100
dialog(k): match on callid and ftag for no ACK'ed dialogs
- some of the TM callbacks look for the dialog with initial INVITE that
has no to-tag yet, even that the callback is run on 200ok and dialog was
updated with this field
- reported by Jon Bergli Heier
(cherry picked from commit 390383e2d0dff755ff9f0eb6a6b1fe627dc29949)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=06d1739…
Author: Alexandr Dubovikov <alexandr.dubovikov(a)gmail.com>
Date: Fri Feb 3 16:12:38 2012 +0100
modules_k:siptrace fixed function pipport2su. (error if url doesn't have port)
Thanks David Kovarik for report.
(cherry picked from commit 830544e5b349bf808fb0f1ac12cf08610181c64d)
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b8b6d22…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Tue Jan 31 23:08:02 2012 +0100
snmpstats: safe destroy in case of invalid startup
- some pointers were not intialized yet, but due to destroy of no-startup
they were accessed
- reported by Klaus Feichtinger
(cherry picked from commit 06e71ad96e8f13bafac1fa5d968538f98bd08df5)
THIS IS AN AUTOMATED MESSAGE, DO NOT REPLY.
The following task is now closed:
FS#212 - pua_reginfo callid XML string assignment small bug
User who did this - Daniel-Constantin Mierla (miconda)
Reason for closing: Fixed
Additional comments about closing: Thanks, patch applied
More information can be found at the following URL:
http://sip-router.org/tracker/index.php?do=details&task_id=212
You are receiving this message because you have requested it from the Flyspray bugtracking system. If you did not expect this message or don't want to receive mails in future, you can change your notification settings at the URL shown above.