1 Index: modules/enum/enum_mod.h |
|
2 diff -Nau modules/enum/enum_mod.h.orig modules/enum/enum_mod.h |
|
3 --- modules/enum/enum_mod.h.orig 2010-01-18 15:54:52.842465412 +0100 |
|
4 +++ modules/enum/enum_mod.h 2010-01-18 15:55:20.812190874 +0100 |
|
5 @@ -41,5 +41,7 @@ |
|
6 extern str i_branchlabel; /* the label branching off the infrastructure tree */ |
|
7 extern str i_bl_alg; /* how to know where to branch off */ |
|
8 |
|
9 +extern str isnsuffix; /* str version of isn_suffix */ |
|
10 + |
|
11 |
|
12 #endif /* ENUM_MOD_H */ |
|
13 Index: modules/enum/enum_mod.c |
|
14 diff -Nau modules/enum/enum_mod.c.orig modules/enum/enum_mod.c |
|
15 --- modules/enum/enum_mod.c.orig 2010-01-18 15:52:57.316263519 +0100 |
|
16 +++ modules/enum/enum_mod.c 2010-01-18 15:52:42.844229824 +0100 |
|
17 @@ -55,6 +55,8 @@ |
|
18 char* i_enum_suffix = "e164.arpa."; |
|
19 char* bl_algorithm = "cc"; |
|
20 |
|
21 +char* isn_suffix = "freenum.org."; |
|
22 + |
|
23 |
|
24 /* |
|
25 * Internal module variables |
|
26 @@ -67,6 +69,8 @@ |
|
27 str i_branchlabel; |
|
28 str i_bl_alg; |
|
29 |
|
30 +str isnsuffix; |
|
31 + |
|
32 |
|
33 /* |
|
34 * Exported functions |
|
35 @@ -94,6 +98,11 @@ |
|
36 REQUEST_ROUTE}, |
|
37 {"i_enum_query", (cmd_function)i_enum_query_2, 2, fixup_str_str, 0, |
|
38 REQUEST_ROUTE}, |
|
39 + {"isn_query", (cmd_function)isn_query_0, 0, 0, 0, REQUEST_ROUTE}, |
|
40 + {"isn_query", (cmd_function)isn_query_1, 1, fixup_str_null, |
|
41 + fixup_free_str_null, REQUEST_ROUTE}, |
|
42 + {"isn_query", (cmd_function)isn_query_2, 2, fixup_str_str, |
|
43 + fixup_free_str_str, REQUEST_ROUTE}, |
|
44 {0, 0, 0, 0, 0, 0} |
|
45 }; |
|
46 |
|
47 @@ -107,6 +116,7 @@ |
|
48 {"branchlabel", STR_PARAM, &branchlabel}, |
|
49 {"i_enum_suffix", STR_PARAM, &i_enum_suffix}, |
|
50 {"bl_algorithm", STR_PARAM, &bl_algorithm}, |
|
51 + {"isn_suffix", STR_PARAM, &isn_suffix}, |
|
52 {0, 0, 0} |
|
53 }; |
|
54 |
|
55 @@ -152,6 +162,9 @@ |
|
56 i_bl_alg.s = bl_algorithm; |
|
57 i_bl_alg.len = strlen(bl_algorithm); |
|
58 |
|
59 + isnsuffix.s = isn_suffix; |
|
60 + isnsuffix.len = strlen(isn_suffix.s); |
|
61 + |
|
62 return 0; |
|
63 } |
|
64 |
|
65 Index: modules/enum/enum.h |
|
66 diff -Nau modules/enum/enum.h.orig modules/enum/enum.h |
|
67 --- modules/enum/enum.h.orig 2010-01-18 15:54:40.361624448 +0100 |
|
68 +++ modules/enum/enum.h 2010-01-18 15:54:43.090330399 +0100 |
|
69 @@ -66,5 +66,13 @@ |
|
70 int i_enum_query_1(struct sip_msg* _msg, char* _suffix, char* _str2); |
|
71 int i_enum_query_2(struct sip_msg* _msg, char* _suffix, char* _service); |
|
72 |
|
73 +/* |
|
74 + * Make ISN query and if query succeeds, replace current uri with the |
|
75 + * result of the query |
|
76 + */ |
|
77 +int isn_query_0(struct sip_msg* _msg, char* _str1, char* _str2); |
|
78 +int isn_query_1(struct sip_msg* _msg, char* _suffix, char* _str2); |
|
79 +int isn_query_2(struct sip_msg* _msg, char* _suffix, char* _service); |
|
80 + |
|
81 |
|
82 #endif /* ENUM_H */ |
|
83 Index: modules/enum/enum.c |
|
84 diff -Nau modules/enum/enum.c.orig modules/enum/enum.c |
|
85 --- modules/enum/enum.c.orig 2010-01-18 15:57:10.995902181 +0100 |
|
86 +++ modules/enum/enum.c 2010-01-18 15:46:19.642209178 +0100 |
|
87 @@ -736,6 +736,84 @@ |
|
88 } |
|
89 |
|
90 |
|
91 +/* |
|
92 + * Call isn_query_2 with module parameter suffix and default service. |
|
93 + */ |
|
94 +int isn_query_0(struct sip_msg* _msg, char* _str1, char* _str2) |
|
95 +{ |
|
96 + return isn_query_2(_msg, (char *)(&isnsuffix), (char *)(&service)); |
|
97 +} |
|
98 + |
|
99 + |
|
100 +/* |
|
101 + * Call isn_query_2 with given suffix and default service. |
|
102 + */ |
|
103 +int isn_query_1(struct sip_msg* _msg, char* _suffix, char* _str2) |
|
104 +{ |
|
105 + return isn_query_2(_msg, _suffix, (char *)(&service)); |
|
106 +} |
|
107 + |
|
108 + |
|
109 +/* |
|
110 + * See documentation in README file. |
|
111 + */ |
|
112 +int isn_query_2(struct sip_msg* _msg, char* _suffix, char* _service) |
|
113 +{ |
|
114 + char *user_s = NULL; |
|
115 + int user_len, i, j; |
|
116 + char name[MAX_DOMAIN_SIZE] = {0}; |
|
117 + char string[17] = {0}; |
|
118 + char szItad[17] = {0}; |
|
119 + size_t nItlen = 0; |
|
120 + |
|
121 + str *suffix, *service; |
|
122 + |
|
123 + suffix = (str*)_suffix; |
|
124 + service = (str*)_service; |
|
125 + |
|
126 + if (parse_sip_msg_uri(_msg) < 0) { |
|
127 + LM_ERR("Parsing of R-URI failed\n"); |
|
128 + return -1; |
|
129 + } |
|
130 + |
|
131 + user_s = _msg->parsed_uri.user.s; |
|
132 + user_len = _msg->parsed_uri.user.len; |
|
133 + |
|
134 + memcpy(&(string[0]), user_s, user_len); |
|
135 + string[user_len] = (char)0; |
|
136 + |
|
137 + /* Do primitive test for correct ISN format, */ |
|
138 + /* and set szItad to the ISN ITAD (RFC 3872/2871). */ |
|
139 + /* Correct ISN format guessed from freenum.org and IANA */ |
|
140 + /* doc http://www.iana.org/assignments/trip-parameters/ */ |
|
141 + { |
|
142 + char *pAster = strchr(string, '*'); |
|
143 + if (pAster && (nItlen = strspn(pAster + sizeof(char), "0123456789"))) |
|
144 + strncpy(szItad, pAster + sizeof(char), nItlen); |
|
145 + else { |
|
146 + LM_ERR("R-URI user does not contain a valid ISN\n"); |
|
147 + return -1; |
|
148 + } |
|
149 + } |
|
150 + |
|
151 + /* Ammend the original ENUM E.164 string logic to process */ |
|
152 + /* ISN numbers instead, which include a nonreversed ITAD. */ |
|
153 + i = user_len - nItlen - sizeof(char); /* Ex: *1212 */ |
|
154 + j = 0; |
|
155 + while (i--) { |
|
156 + name[j] = user_s[i]; |
|
157 + name[j + 1] = '.'; |
|
158 + j = j + 2; |
|
159 + } |
|
160 + |
|
161 + strcat(name + j, szItad); /* Copy the unreversed ITAD, */ |
|
162 + name[j + nItlen] = '.'; /* and append a trailing dot. */ |
|
163 + memcpy(name + j + nItlen + sizeof(char), suffix->s, suffix->len + 1); |
|
164 + |
|
165 + return do_query(_msg, string, name, service); |
|
166 +} |
|
167 + |
|
168 + |
|
169 /*********** INFRASTRUCTURE ENUM ***************/ |
|
170 |
|
171 /* |
|
172 Index: modules/enum/README |
|
173 diff -Nau modules/enum/README.orig modules/enum/README |
|
174 --- modules/enum/README.orig 2010-01-18 17:59:52.034172367 +0100 |
|
175 +++ modules/enum/README 2010-01-18 18:01:30.730633377 +0100 |
|
176 @@ -10,8 +10,8 @@ |
|
177 |
|
178 Copyright © 2002, 2003 Juha Heinanen |
|
179 Revision History |
|
180 - Revision $Revision: 5906 $ $Date: 2009-07-21 10:45:05 +0300 |
|
181 - (Tue, 21 Jul 2009) $ |
|
182 + Revision $Revision: 5907 $ $Date: 2010-01-18 10:45:05 +0100 |
|
183 + (Mon, 18 Jan 2010) $ |
|
184 __________________________________________________________ |
|
185 |
|
186 Table of Contents |
|
187 @@ -25,28 +25,32 @@ |
|
188 1.3.1. domain_suffix (string) |
|
189 1.3.2. tel_uri_params (string) |
|
190 1.3.3. i_enum_suffix (string) |
|
191 - 1.3.4. branchlabel (string) |
|
192 - 1.3.5. bl_algorithm (string) |
|
193 + 1.3.4. isn_suffix (string) |
|
194 + 1.3.5. branchlabel (string) |
|
195 + 1.3.6. bl_algorithm (string) |
|
196 |
|
197 1.4. Exported Functions |
|
198 |
|
199 1.4.1. enum_query(["suffix"[,"service"]]) |
|
200 1.4.2. enum_pv_query("pvar"[,"suffix"[,"service"]]) |
|
201 1.4.3. i_enum_query(["suffix"[,"service"]]) |
|
202 - 1.4.4. is_from_user_enum() |
|
203 + 1.4.4. isn_query(["suffix"[,"service"]]) |
|
204 + 1.4.5. is_from_user_enum() |
|
205 |
|
206 List of Examples |
|
207 |
|
208 1.1. Setting domain_suffix module parameter |
|
209 1.2. Setting tel_uri_params module parameter |
|
210 1.3. Setting i_enum_suffix module parameter |
|
211 - 1.4. Setting brachlabel module parameter |
|
212 - 1.5. Zone file example |
|
213 + 1.4. Setting isn_query usage module parameter |
|
214 + 1.5. Setting branchlabel module parameter |
|
215 1.6. Zone file example |
|
216 - 1.7. Setting the bl_algorithm module parameter |
|
217 - 1.8. enum_query usage |
|
218 - 1.9. enum_pv_query usage |
|
219 - 1.10. is_from_user_enum usage |
|
220 + 1.7. Zone file example |
|
221 + 1.8. Setting the bl_algorithm module parameter |
|
222 + 1.9. enum_query usage |
|
223 + 1.10. enum_pv_query usage |
|
224 + 1.11. isn_query usage |
|
225 + 1.12. is_from_user_enum usage |
|
226 |
|
227 Chapter 1. Admin Guide |
|
228 |
|
229 @@ -113,6 +117,22 @@ |
|
230 function does an enum lookup on the from user and returns true |
|
231 if found, false otherwise. |
|
232 |
|
233 + In addition to standard ENUM, support for ISN (ITAD Subscriber |
|
234 + Numbers) is provided as well. To allow ISN lookups to resolve, |
|
235 + a different formatting algorithm is expected by the DNS server. |
|
236 + Whereas a ENUM NAPTR record expects a DNS query of the form |
|
237 + 9.8.7.6.5.4.3.2.1.<suffix>, ISN method expects a DNS query of |
|
238 + the form 6.5.1212.<suffix>. That is, a valid ISN number includes |
|
239 + a prefix of '56' in the example. The rest of the number is a |
|
240 + ITAD (Internet Telephony Administrative Domain) as defined |
|
241 + in RFCs 3872 and 2871, and as allocated by the IANA in |
|
242 + http://www.iana.org/assignments/trip-parameters. The ITAD is |
|
243 + left intact and not refersed as ENUM requires. To learn more |
|
244 + about ISN please refer to documents at www.freenum.org. |
|
245 + |
|
246 + To complete a ISN lookup on the user part of the Request-URI, |
|
247 + isn_query() is used instead of enum_query(). |
|
248 + |
|
249 1.2. Dependencies |
|
250 |
|
251 The module depends on the following modules (in the other words |
|
252 @@ -158,17 +178,27 @@ |
|
253 Example 1.3. Setting i_enum_suffix module parameter |
|
254 modparam("enum", "i_enum_suffix", "e1234.arpa.") |
|
255 |
|
256 -1.3.4. branchlabel (string) |
|
257 +1.3.4. isn_suffix (string) |
|
258 + |
|
259 + The domain suffix to be used for isn_query() lookups. Can be |
|
260 + overridden by a parameter to isn_query. |
|
261 + |
|
262 + Default value is "freenum.org." |
|
263 + |
|
264 + Example 1.4. Setting isn_suffix module parameter |
|
265 +modparam("enum", "isn_suffix", "freenum.org.") |
|
266 + |
|
267 +1.3.5. branchlabel (string) |
|
268 |
|
269 This parameter determines which label i_enum_query() will use |
|
270 to branch off to the infrastructure ENUM tree. |
|
271 |
|
272 Default value is ""i"" |
|
273 |
|
274 - Example 1.4. Setting brachlabel module parameter |
|
275 + Example 1.5. Setting branchlabel module parameter |
|
276 modparam("enum", "branchlabel", "i") |
|
277 |
|
278 -1.3.5. bl_algorithm (string) |
|
279 +1.3.6. bl_algorithm (string) |
|
280 |
|
281 This parameter determines which algorithm i_enum_query() will |
|
282 use to select the position in the DNS tree where the |
|
283 @@ -182,7 +212,7 @@ |
|
284 [branchlabel].[reverse-country-code].[i_enum_suffix] to |
|
285 indicate after how many digits the label should in inserted. |
|
286 |
|
287 - Example 1.5. Zone file example |
|
288 + Example 1.6. Zone file example |
|
289 i.1.e164.arpa. IN TXT "4" |
|
290 9.9.9.8.7.6.5.i.4.3.2.1.e164.arpa. IN NAPTR "NAPTR content for +1 234 5 |
|
291 678 999" |
|
292 @@ -196,7 +226,7 @@ |
|
293 allocated yet. This version of the code uses 65300. See |
|
294 resolve.h. |
|
295 |
|
296 - Example 1.6. Zone file example |
|
297 + Example 1.7. Zone file example |
|
298 i.1.e164.arpa. TYPE65300 \# 14 ( |
|
299 04 ; position |
|
300 01 69 ; separator |
|
301 @@ -208,7 +238,7 @@ |
|
302 |
|
303 Default value is "cc" |
|
304 |
|
305 - Example 1.7. Setting the bl_algorithm module parameter |
|
306 + Example 1.8. Setting the bl_algorithm module parameter |
|
307 modparam("enum", "bl_algorithm", "txt") |
|
308 |
|
309 1.4. Exported Functions |
|
310 @@ -225,7 +255,7 @@ |
|
311 |
|
312 This function can be used from REQUEST_ROUTE. |
|
313 |
|
314 - Example 1.8. enum_query usage |
|
315 + Example 1.9. enum_query usage |
|
316 ... |
|
317 # search for "e2u+sip" in freenum.org |
|
318 enum_query("freenum.org."); |
|
319 @@ -262,7 +292,7 @@ |
|
320 |
|
321 This function can be used from REQUEST_ROUTE. |
|
322 |
|
323 - Example 1.9. enum_pv_query usage |
|
324 + Example 1.10. enum_pv_query usage |
|
325 ... |
|
326 # search for "e2u+sip" in freenum.org |
|
327 enum_pv_query("$avp(i:100)", "freenum.org."); |
|
328 @@ -296,14 +326,42 @@ |
|
329 ftp://ftp.rfc-editor.org/in-notes/internet-drafts/draft-haberle |
|
330 r-carrier-enum-01.txt for the rationale behind this function. |
|
331 |
|
332 -1.4.4. is_from_user_enum() |
|
333 +1.4.4. isn_query(["suffix"[,"service"]]) |
|
334 + |
|
335 + The function performs a ISN query and rewrites the |
|
336 + Request-URI with the result of the query. See Section 1.1, |
|
337 + "Overview" for more information. |
|
338 + |
|
339 + Meaning of the parameters is as follows: |
|
340 + * suffix - Suffix to be appended to the domain name. |
|
341 + * service - Service string to be used in the service field. |
|
342 + |
|
343 + This function can be used from REQUEST_ROUTE. |
|
344 + |
|
345 + See ftp://www.ietf.org/rfc/rfc3872.txt and |
|
346 + ftp://www.ietf.org/rfc/rfc2871.txt for information |
|
347 + regarding the ITAD part of the ISN string. |
|
348 + |
|
349 + Example 1.11. isn_query usage |
|
350 +... |
|
351 +# search for "e2u+sip" in freenum.org |
|
352 +isn_query("freenum.org."); |
|
353 +... |
|
354 +# search for "e2u+sip" in default tree (configured as parameter) |
|
355 +enum_query(); |
|
356 +... |
|
357 +# search for "e2u+voice:sip" in freenum.org |
|
358 +enum_query("freenum.org.","voice"); |
|
359 +... |
|
360 + |
|
361 +1.4.5. is_from_user_enum() |
|
362 |
|
363 Checks if the user part of from URI is found in an enum lookup. |
|
364 Returns 1 if yes and -1 if not. |
|
365 |
|
366 This function can be used from REQUEST_ROUTE. |
|
367 |
|
368 - Example 1.10. is_from_user_enum usage |
|
369 + Example 1.12. is_from_user_enum usage |
|
370 ... |
|
371 if (is_from_user_enum()) { |
|
372 .... |
|
373 Index: modules/enum/doc/enum.xml |
|
374 diff -Nau modules/enum/doc/enum.xml.orig modules/enum/doc/enum.xml |
|
375 --- modules/enum/doc/enum.xml.orig 2009-10-16 02:31:52.000000000 +0200 |
|
376 +++ modules/enum/doc/enum.xml 2010-01-18 18:01:15.954172402 +0100 |
|
377 @@ -33,8 +33,8 @@ |
|
378 </copyright> |
|
379 <revhistory> |
|
380 <revision> |
|
381 - <revnumber>$Revision: 5901 $</revnumber> |
|
382 - <date>$Date: 2009-07-21 10:45:05 +0300 (Tue, 21 Jul 2009) $</date> |
|
383 + <revnumber>$Revision: 5907 $</revnumber> |
|
384 + <date>$Date: 2010-01-18 10:45:05 +0100 (Mon, 18 Jan 2010) $</date> |
|
385 </revision> |
|
386 </revhistory> |
|
387 </bookinfo> |
|
388 Index: modules/enum/doc/enum_admin.xml |
|
389 diff -Nau modules/enum/doc/enum_admin.xml.orig modules/enum/doc/enum_admin.xml |
|
390 --- modules/enum/doc/enum_admin.xml.orig 2010-01-18 12:33:30.053644000 +0100 |
|
391 +++ modules/enum/doc/enum_admin.xml 2010-01-18 18:14:59.583157910 +0100 |
|
392 @@ -75,6 +75,24 @@ |
|
393 and -1 if not. |
|
394 </para> |
|
395 <para> |
|
396 + In addition to standard ENUM, support for ISN (ITAD Subscriber |
|
397 + Numbers) is provided as well. To allow ISN lookups to resolve, |
|
398 + a different formatting algorithm is expected by the DNS server. |
|
399 + Whereas a ENUM NAPTR record expects a DNS query of the form |
|
400 + 9.8.7.6.5.4.3.2.1.<suffix>, ISN method expects a DNS query of |
|
401 + the form 6.5.1212.<suffix>. That is, a valid ISN number includes |
|
402 + a prefix of '56' in the example. The rest of the number is a |
|
403 + ITAD (Internet Telephony Administrative Domain) as defined |
|
404 + in RFCs 3872 and 2871, and as allocated by the IANA in |
|
405 + http://www.iana.org/assignments/trip-parameters. The ITAD is |
|
406 + left intact and not refersed as ENUM requires. To learn more |
|
407 + about ISN please refer to documents at www.freenum.org. |
|
408 + </para> |
|
409 + <para> |
|
410 + To complete a ISN lookup on the user part of the Request-URI, |
|
411 + isn_query() is used instead of enum_query(). |
|
412 + </para> |
|
413 + <para> |
|
414 Enum module also implements is_from_user_enum function. |
|
415 This function does an enum lookup on the from user and |
|
416 returns true if found, false otherwise. |
|
417 @@ -153,6 +171,22 @@ |
|
418 </example> |
|
419 </section> |
|
420 <section> |
|
421 + <title><varname>isn_suffix</varname> (string)</title> |
|
422 + <para> |
|
423 + The domain suffix to be used for isn_query() lookups. Can |
|
424 + be overridden by a parameter to isn_query. |
|
425 + </para> |
|
426 + <para> |
|
427 + Default value is <quote>freenum.org.</quote> |
|
428 + </para> |
|
429 + <example> |
|
430 + <title>Setting isn_suffix module parameter</title> |
|
431 + <programlisting format="linespecific"> |
|
432 +modparam("enum", "isn_suffix", "freenum.org.") |
|
433 +</programlisting> |
|
434 + </example> |
|
435 + </section> |
|
436 + <section> |
|
437 <title><varname>branchlabel</varname> (string)</title> |
|
438 <para> |
|
439 This parameter determines which label i_enum_query() will use |
|
440 @@ -162,7 +196,7 @@ |
|
441 Default value is <quote>"i"</quote> |
|
442 </para> |
|
443 <example> |
|
444 - <title>Setting brachlabel module parameter</title> |
|
445 + <title>Setting branchlabel module parameter</title> |
|
446 <programlisting format="linespecific"> |
|
447 modparam("enum", "branchlabel", "i") |
|
448 </programlisting> |
|
449 @@ -353,6 +387,53 @@ |
|
450 </section> |
|
451 |
|
452 <section> |
|
453 + <title> |
|
454 + <function moreinfo="none">isn_query(["suffix"[,"service"]])</function> |
|
455 + </title> |
|
456 + <para> |
|
457 + The function performs a ISN query and rewrites the Request-URI with |
|
458 + the result of the query. See <xref linkend="sec-overview"/> for more |
|
459 + information. |
|
460 + </para> |
|
461 + <para>Meaning of the parameters is as follows:</para> |
|
462 + <itemizedlist> |
|
463 + <listitem> |
|
464 + <para><emphasis>suffix</emphasis> - Suffix to be appended to the |
|
465 + domain name. |
|
466 + </para> |
|
467 + </listitem> |
|
468 + <listitem> |
|
469 + <para><emphasis>service</emphasis> - Service string to be used in |
|
470 + the service field. |
|
471 + </para> |
|
472 + </listitem> |
|
473 + </itemizedlist> |
|
474 + <para> |
|
475 + This function can be used from REQUEST_ROUTE. |
|
476 + </para> |
|
477 + <para> |
|
478 + See ftp://www.ietf.org/rfc/rfc3872.txt and |
|
479 + ftp://www.ietf.org/rfc/rfc2871.txt for information |
|
480 + regarding the ITAD part of the ISN string. |
|
481 + </para> |
|
482 + <example> |
|
483 + <title><function moreinfo="none">isn_query</function> usage</title> |
|
484 + <programlisting format="linespecific"> |
|
485 +... |
|
486 +# search for "e2u+sip" in freenum.org |
|
487 +isn_query("freenum.org."); |
|
488 +... |
|
489 +# search for "e2u+sip" in default tree (configured as parameter) |
|
490 +isn_query(); |
|
491 +... |
|
492 +# search for "e2u+voice:sip" in freenum.org |
|
493 +isn_query("freenum.org.","voice"); |
|
494 +... |
|
495 +</programlisting> |
|
496 + </example> |
|
497 + </section> |
|
498 + |
|
499 + <section> |
|
500 <title><function moreinfo="none">is_from_user_enum()</function></title> |
|
501 <para> |
|
502 Checks if the user part of from <abbrev>URI</abbrev> |
|