Mon, 16 Jan 2012 23:08:14 +0100
Inconclusively complete possibly missing fields. This change introduces
inconsistencies difficult to correct given incomplete documentation of
IPKG and OPKG packaging standards.
michael@18 | 1 | UAC module authentication extention (contribution) |
michael@18 | 2 | |
michael@18 | 3 | Problem |
michael@18 | 4 | |
michael@18 | 5 | A problem involving SIP authentication has plagued OpenSIPS for years. |
michael@18 | 6 | Because OpenSIPS is a proxy it may not manipulate the CSEQ of incoming |
michael@18 | 7 | requests or responses. When a UAC sends a SIP message which triggers |
michael@18 | 8 | an authentication challenge from another proxy or external UAS, OpenSIPS |
michael@18 | 9 | may receive a SIP response message with a 401 or 407 code. |
michael@18 | 10 | |
michael@18 | 11 | The UAC module provides a function uac_auth() to allow OpenSIPS to |
michael@18 | 12 | authenticate, however it is of limited utility because any SIP compliant |
michael@18 | 13 | proxy, PBX, or UAS sending such authentication challenges expects the |
michael@18 | 14 | CSEQ of the succeeding request to be different than the preceding one. |
michael@18 | 15 | |
michael@18 | 16 | Solution |
michael@18 | 17 | |
michael@18 | 18 | While somewhat of a hack, one solution to this problem is to forward |
michael@18 | 19 | code 401 and 407 responses to the UAC which will formulate an |
michael@18 | 20 | authorization header, insert it into the original request, and |
michael@18 | 21 | send the message again after incrementing the CSEQ. OpenSIPS |
michael@18 | 22 | receives the new request and passes it with success this time. |
michael@18 | 23 | |
michael@18 | 24 | This solution requires new hack logic to allow OpenSIPS to provide |
michael@18 | 25 | the uac_auth() function inside of request routing blocks, whereas |
michael@18 | 26 | the unmodified versions of OpenSIPS allow usage of uac_auth() only |
michael@18 | 27 | in failure routes. |
michael@18 | 28 | |
michael@18 | 29 | Usage |
michael@18 | 30 | |
michael@18 | 31 | To use the new logic simply follow the instructions of uac_auth() usage |
michael@18 | 32 | on incoming SIP requests (for example INVITE) inside a main or secondary |
michael@18 | 33 | routing block like so: |
michael@18 | 34 | |
michael@18 | 35 | if (!load_gws()) { |
michael@18 | 36 | send_reply("500", "Server Internal Error"); |
michael@18 | 37 | exit; |
michael@18 | 38 | } |
michael@18 | 39 | if (!next_gw()) { |
michael@18 | 40 | send_reply("503", "Service Unavailable"); |
michael@18 | 41 | exit; |
michael@18 | 42 | } |
michael@18 | 43 | if ($avp(s:authuser) == "") { # this is in case no user exists |
michael@18 | 44 | $avp(s:authuser) = $fU; # in the gw database table row |
michael@18 | 45 | } |
michael@18 | 46 | if ($hdr(P-hint) != "lcr applied") { |
michael@18 | 47 | append_hf("P-hint: lcr applied\r\n"); |
michael@18 | 48 | } |
michael@18 | 49 | |
michael@18 | 50 | # the following uac_auth avp parameters are filled in |
michael@18 | 51 | # by the lcr itself, through a patch to its datatables |
michael@18 | 52 | uac_auth(); # patched for use in request route as well |
michael@18 | 53 | route(1); # forward to gateway provider |
michael@18 | 54 | |
michael@18 | 55 | Location |
michael@18 | 56 | |
michael@18 | 57 | http://scm.europalab.com/contrib/opensips/ |
michael@18 | 58 | http://scm.europalab.com/contrib/file/tip/opensips/ |
michael@18 | 59 | http://scm.europalab.com/contrib/file/tip/opensips/uac-reauth.txt |
michael@18 | 60 | http://scm.europalab.com/contrib/file/tip/opensips/uac-reauth.diff |
michael@18 | 61 | |
michael@18 | 62 | Instructions |
michael@18 | 63 | |
michael@18 | 64 | To integrate this contributed logic into the source code tree of |
michael@18 | 65 | a OpenSIPS distribution, download the unified diff and use the |
michael@18 | 66 | patch(1) command: |
michael@18 | 67 | |
michael@18 | 68 | $ cd /tmp && mkdir uac-patch && cd uac-patch |
michael@18 | 69 | $ wget http://scm.europalab.com/contrib/raw-file/tip/opensips/uac-reauth.diff |
michael@18 | 70 | $ tar zxf /tmp/opensips-<version>-tls.tar.gz |
michael@18 | 71 | $ cd opensips-<version>-tls |
michael@18 | 72 | $ patch -p0 <../uac-reauth.diff |
michael@18 | 73 | |
michael@18 | 74 | Disclaimer |
michael@18 | 75 | |
michael@18 | 76 | This software contribution is based on source code from OpenSIPS SVN |
michael@18 | 77 | revision 6590. The author makes no guarantees as to this contribution. |
michael@18 | 78 | A user who downloads and executes it does so at his own risk. |
michael@18 | 79 | |
michael@18 | 80 | Michael Schloh von Bennewitz |
michael@18 | 81 | http://michael.schloh.com/ |
michael@18 | 82 | Wednsday, 10. February 2010 |