tsip_parser_header_Proxy_Authorization.rl 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. ///*
  2. //* Copyright (C) 2010-2011 Mamadou Diop.
  3. //*
  4. //* Contact: Mamadou Diop <diopmamadou(at)doubango[dot]org>
  5. //*
  6. //* This file is part of Open Source Doubango Framework.
  7. //*
  8. //* DOUBANGO is free software: you can redistribute it and/or modify
  9. //* it under the terms of the GNU General Public License as published by
  10. //* the Free Software Foundation, either version 3 of the License, or
  11. //* (at your option) any later version.
  12. //*
  13. //* DOUBANGO is distributed in the hope that it will be useful,
  14. //* but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. //* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. //* GNU General Public License for more details.
  17. //*
  18. //* You should have received a copy of the GNU General Public License
  19. //* along with DOUBANGO.
  20. //*
  21. //*/
  22. //
  23. ///**@file tsip_header_Proxy_Authorization.c
  24. // * @brief SIP Proxy-Authenticate header.
  25. // *
  26. // * @author Mamadou Diop <diopmamadou(at)doubango[dot]org>
  27. // *
  28. //
  29. // */
  30. //#include "tinysip/headers/tsip_header_Proxy_Authorization.h"
  31. //
  32. //#include "tinysip/parsers/tsip_parser_uri.h"
  33. //
  34. //#include "tsk_debug.h"
  35. //#include "tsk_memory.h"
  36. //#include "tsk_time.h"
  37. //
  38. //#include <string.h>
  39. //
  40. //
  41. ///***********************************
  42. //* Ragel state machine.
  43. //*/
  44. //%%{
  45. // machine tsip_machine_parser_header_Proxy_Authorization;
  46. //
  47. // # Includes
  48. // include tsip_machine_utils "./ragel/tsip_machine_utils.rl";
  49. //
  50. // action tag
  51. // {
  52. // tag_start = p;
  53. // }
  54. //
  55. // action is_digest
  56. // {
  57. // #//FIXME: Only Digest is supported
  58. // hdr_Proxy_Authorization->scheme = tsk_strdup("Digest");
  59. // }
  60. //
  61. // action parse_username
  62. // {
  63. // TSK_PARSER_SET_STRING(hdr_Proxy_Authorization->username);
  64. // tsk_strunquote(&hdr_Proxy_Authorization->username);
  65. // }
  66. //
  67. // action parse_realm
  68. // {
  69. // TSK_PARSER_SET_STRING(hdr_Proxy_Authorization->realm);
  70. // tsk_strunquote(&hdr_Proxy_Authorization->realm);
  71. // }
  72. //
  73. // action parse_nonce
  74. // {
  75. // TSK_PARSER_SET_STRING(hdr_Proxy_Authorization->nonce);
  76. // tsk_strunquote(&hdr_Proxy_Authorization->nonce);
  77. // }
  78. //
  79. // action parse_uri
  80. // {
  81. // TSK_PARSER_SET_STRING(hdr_Proxy_Authorization->line.request.uri);
  82. // }
  83. //
  84. // action parse_response
  85. // {
  86. // TSK_PARSER_SET_STRING(hdr_Proxy_Authorization->response);
  87. // tsk_strunquote(&hdr_Proxy_Authorization->response);
  88. // }
  89. //
  90. // action parse_algorithm
  91. // {
  92. // TSK_PARSER_SET_STRING(hdr_Proxy_Authorization->algorithm);
  93. // }
  94. //
  95. // action parse_cnonce
  96. // {
  97. // TSK_PARSER_SET_STRING(hdr_Proxy_Authorization->cnonce);
  98. // tsk_strunquote(&hdr_Proxy_Authorization->cnonce);
  99. // }
  100. //
  101. // action parse_opaque
  102. // {
  103. // TSK_PARSER_SET_STRING(hdr_Proxy_Authorization->opaque);
  104. // tsk_strunquote(&hdr_Proxy_Authorization->opaque);
  105. // }
  106. //
  107. // action parse_qop
  108. // {
  109. // TSK_PARSER_SET_STRING(hdr_Proxy_Authorization->qop);
  110. // //tsk_strunquote(&hdr_Proxy_Authorization->qop);
  111. // }
  112. //
  113. // action parse_nc
  114. // {
  115. // TSK_PARSER_SET_STRING(hdr_Proxy_Authorization->nc);
  116. // TSK_DEBUG_INFO("PROXY_AUTHORIZATION:PARSE_NC");
  117. // }
  118. //
  119. // action parse_param
  120. // {
  121. // TSK_PARSER_ADD_PARAM(TSIP_HEADER_PARAMS(hdr_Proxy_Authorization));
  122. // }
  123. //
  124. // action eob
  125. // {
  126. // }
  127. //
  128. // #FIXME: Only Digest (MD5, AKAv1-MD5 and AKAv2-MD5) is supported
  129. // qop_value = "auth" | "auth-int" | token;
  130. // other_response = (any+);
  131. // auth_param = generic_param>tag %parse_param;
  132. //
  133. // username = "username"i EQUAL quoted_string>tag %parse_username;
  134. // realm = "realm"i EQUAL quoted_string>tag %parse_realm;
  135. // nonce = "nonce"i EQUAL quoted_string>tag %parse_nonce;
  136. // digest_uri = "uri"i EQUAL LDQUOT <: (any*)>tag %parse_uri :> RDQUOT;
  137. // #dresponse = "response"i EQUAL LDQUOT <: (LHEX{32})>tag %parse_response :> RDQUOT;
  138. // dresponse = "response"i EQUAL quoted_string>tag %parse_response;
  139. // algorithm = "algorithm"i EQUAL <:token>tag %parse_algorithm;
  140. // cnonce = "cnonce"i EQUAL quoted_string>tag %parse_cnonce;
  141. // opaque = "opaque"i EQUAL quoted_string>tag %parse_opaque;
  142. // message_qop = "qop"i EQUAL qop_value>tag %parse_qop;
  143. // nonce_count = "nc"i EQUAL (LHEX{8})>tag %parse_nc;
  144. //
  145. // dig_resp = (username | realm | nonce | digest_uri | dresponse | algorithm | cnonce | opaque | message_qop | nonce_count)@1 | auth_param@0;
  146. // digest_response = dig_resp ( COMMA dig_resp )*;
  147. // credentials = ( "Digest"i LWS digest_response )>is_digest | other_response;
  148. // Proxy_Authorization = "Proxy-Authorization"i HCOLON credentials;
  149. //
  150. // # Entry point
  151. // main := Proxy_Authorization :>CRLF @eob;
  152. //
  153. //}%%
  154. //
  155. //int tsip_header_Proxy_Authorization_serialize(const tsip_header_t* header, tsk_buffer_t* output)
  156. //{
  157. // if(header)
  158. // {
  159. // const tsip_header_Proxy_Authorization_t *Proxy_Authorization = header;
  160. // if(Proxy_Authorization && Proxy_Authorization->scheme)
  161. // {
  162. // return tsk_buffer_append_2(output, "%s %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
  163. // Proxy_Authorization->scheme,
  164. //
  165. // Proxy_Authorization->username ? "username=\"" : "",
  166. // Proxy_Authorization->username ? Proxy_Authorization->username : "",
  167. // Proxy_Authorization->username ? "\"" : "",
  168. //
  169. // Proxy_Authorization->realm ? ",realm=\"" : "",
  170. // Proxy_Authorization->realm ? Proxy_Authorization->realm : "",
  171. // Proxy_Authorization->realm ? "\"" : "",
  172. //
  173. // Proxy_Authorization->nonce ? ",nonce=\"" : "",
  174. // Proxy_Authorization->nonce ? Proxy_Authorization->nonce : "",
  175. // Proxy_Authorization->nonce ? "\"" : "",
  176. //
  177. // Proxy_Authorization->line.request.uri ? ",uri=\"" : "",
  178. // Proxy_Authorization->line.request.uri ? Proxy_Authorization->line.request.uri : "",
  179. // Proxy_Authorization->line.request.uri ? "\"" : "",
  180. //
  181. // Proxy_Authorization->response ? ",response=\"" : "",
  182. // Proxy_Authorization->response ? Proxy_Authorization->response : "",
  183. // Proxy_Authorization->response ? "\"" : "",
  184. //
  185. // Proxy_Authorization->algorithm ? ",algorithm=" : "",
  186. // Proxy_Authorization->algorithm ? Proxy_Authorization->algorithm : "",
  187. //
  188. // Proxy_Authorization->cnonce ? ",cnonce=\"" : "",
  189. // Proxy_Authorization->cnonce ? Proxy_Authorization->cnonce : "",
  190. // Proxy_Authorization->cnonce ? "\"" : "",
  191. //
  192. // Proxy_Authorization->opaque ? ",opaque=\"" : "",
  193. // Proxy_Authorization->opaque ? Proxy_Authorization->opaque : "",
  194. // Proxy_Authorization->opaque ? "\"" : "",
  195. //
  196. // Proxy_Authorization->qop ? ",qop=" : "",
  197. // Proxy_Authorization->qop ? Proxy_Authorization->qop : "",
  198. //
  199. // Proxy_Authorization->nc ? ",nc=" : "",
  200. // Proxy_Authorization->nc ? Proxy_Authorization->nc : ""
  201. // );
  202. // }
  203. // }
  204. // return -1;
  205. //}
  206. //
  207. //tsip_header_Proxy_Authorization_t *tsip_header_Proxy_Authorization_parse(const char *data, tsk_size_t size)
  208. //{
  209. // int cs = 0;
  210. // const char *p = data;
  211. // const char *pe = p + size;
  212. // const char *eof = pe;
  213. // tsip_header_Proxy_Authorization_t *hdr_Proxy_Authorization = TSIP_HEADER_PROXY_AUTHORIZATION_CREATE();
  214. //
  215. // const char *tag_start = tsk_null;
  216. //
  217. // %%write data;
  218. // %%write init;
  219. // %%write exec;
  220. //
  221. // if( cs < %%{ write first_final; }%% )
  222. // {
  223. // TSK_OBJECT_SAFE_FREE(hdr_Proxy_Authorization);
  224. // }
  225. //
  226. // return hdr_Proxy_Authorization;
  227. //}
  228. //
  229. //
  230. //
  231. //
  232. //
  233. //
  234. //
  235. ////========================================================
  236. //// Proxy_Authorization header object definition
  237. ////
  238. //
  239. //static tsk_object_t* tsip_header_Proxy_Authorization_ctor(tsk_object_t *self, va_list * app)
  240. //{
  241. // tsip_header_Proxy_Authorization_t *Proxy_Authorization = self;
  242. // if(Proxy_Authorization)
  243. // {
  244. // TSIP_HEADER(Proxy_Authorization)->type = tsip_htype_Proxy_Authorization;
  245. // TSIP_HEADER(Proxy_Authorization)->serialize = tsip_header_Proxy_Authorization_serialize;
  246. // }
  247. // else
  248. // {
  249. // TSK_DEBUG_ERROR("Failed to create new Proxy_Authorization header.");
  250. // }
  251. // return self;
  252. //}
  253. //
  254. //static tsk_object_t* tsip_header_Proxy_Authorization_dtor(tsk_object_t *self)
  255. //{
  256. // tsip_header_Proxy_Authorization_t *Proxy_Authorization = self;
  257. // if(Proxy_Authorization)
  258. // {
  259. // TSK_FREE(Proxy_Authorization->scheme);
  260. // TSK_FREE(Proxy_Authorization->username);
  261. // TSK_FREE(Proxy_Authorization->realm);
  262. // TSK_FREE(Proxy_Authorization->nonce);
  263. // TSK_FREE(Proxy_Authorization->line.request.uri);
  264. // TSK_FREE(Proxy_Authorization->response);
  265. // TSK_FREE(Proxy_Authorization->algorithm);
  266. // TSK_FREE(Proxy_Authorization->cnonce);
  267. // TSK_FREE(Proxy_Authorization->opaque);
  268. // TSK_FREE(Proxy_Authorization->qop);
  269. // TSK_FREE(Proxy_Authorization->nc);
  270. //
  271. // TSK_OBJECT_SAFE_FREE(TSIP_HEADER_PARAMS(Proxy_Authorization));
  272. // }
  273. // else TSK_DEBUG_ERROR("Null Proxy_Authorization header.");
  274. //
  275. // return self;
  276. //}
  277. //
  278. //static const tsk_object_def_t tsip_header_Proxy_Authorization_def_s =
  279. //{
  280. // sizeof(tsip_header_Proxy_Authorization_t),
  281. // tsip_header_Proxy_Authorization_ctor,
  282. // tsip_header_Proxy_Authorization_dtor,
  283. // 0
  284. //};
  285. //const void *tsip_header_Proxy_Authorization_def_t = &tsip_header_Proxy_Authorization_def_s;