security_events.c 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194
  1. /*
  2. * Asterisk -- An open source telephony toolkit.
  3. *
  4. * Copyright (C) 2012, Digium, Inc.
  5. *
  6. * Russell Bryant <russell@digium.com>
  7. *
  8. * See http://www.asterisk.org for more information about
  9. * the Asterisk project. Please do not directly contact
  10. * any of the maintainers of this project for assistance;
  11. * the project provides a web site, mailing lists and IRC
  12. * channels for your use.
  13. *
  14. * This program is free software, distributed under the terms of
  15. * the GNU General Public License Version 2. See the LICENSE file
  16. * at the top of the source tree.
  17. */
  18. /*!
  19. * \file
  20. *
  21. * \brief Security Event Reporting Helpers
  22. *
  23. * \author Russell Bryant <russell@digium.com>
  24. */
  25. /*** MODULEINFO
  26. <support_level>core</support_level>
  27. ***/
  28. /*** DOCUMENTATION
  29. <managerEvent language="en_US" name="FailedACL">
  30. <managerEventInstance class="EVENT_FLAG_SECURITY">
  31. <synopsis>Raised when a request violates an ACL check.</synopsis>
  32. <syntax>
  33. <parameter name="EventTV">
  34. <para>The time the event was detected.</para>
  35. </parameter>
  36. <parameter name="Severity">
  37. <para>A relative severity of the security event.</para>
  38. <enumlist>
  39. <enum name="Informational"/>
  40. <enum name="Error"/>
  41. </enumlist>
  42. </parameter>
  43. <parameter name="Service">
  44. <para>The Asterisk service that raised the security event.</para>
  45. </parameter>
  46. <parameter name="EventVersion">
  47. <para>The version of this event.</para>
  48. </parameter>
  49. <parameter name="AccountID">
  50. <para>The Service account associated with the security event
  51. notification.</para>
  52. </parameter>
  53. <parameter name="SessionID">
  54. <para>A unique identifier for the session in the service
  55. that raised the event.</para>
  56. </parameter>
  57. <parameter name="LocalAddress">
  58. <para>The address of the Asterisk service that raised the
  59. security event.</para>
  60. </parameter>
  61. <parameter name="RemoteAddress">
  62. <para>The remote address of the entity that caused the
  63. security event to be raised.</para>
  64. </parameter>
  65. <parameter name="Module" required="false">
  66. <para>If available, the name of the module that raised the event.</para>
  67. </parameter>
  68. <parameter name="ACLName" required="false">
  69. <para>If available, the name of the ACL that failed.</para>
  70. </parameter>
  71. <parameter name="SessionTV" required="false">
  72. <para>The timestamp reported by the session.</para>
  73. </parameter>
  74. </syntax>
  75. </managerEventInstance>
  76. </managerEvent>
  77. <managerEvent language="en_US" name="InvalidAccountID">
  78. <managerEventInstance class="EVENT_FLAG_SECURITY">
  79. <synopsis>Raised when a request fails an authentication check due to an invalid account ID.</synopsis>
  80. <syntax>
  81. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  82. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  83. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  84. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  85. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  86. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  87. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  88. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  89. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  90. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  91. </syntax>
  92. </managerEventInstance>
  93. </managerEvent>
  94. <managerEvent language="en_US" name="SessionLimit">
  95. <managerEventInstance class="EVENT_FLAG_SECURITY">
  96. <synopsis>Raised when a request fails due to exceeding the number of allowed concurrent sessions for that service.</synopsis>
  97. <syntax>
  98. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  99. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  100. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  101. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  102. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  103. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  104. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  105. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  106. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  107. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  108. </syntax>
  109. </managerEventInstance>
  110. </managerEvent>
  111. <managerEvent language="en_US" name="MemoryLimit">
  112. <managerEventInstance class="EVENT_FLAG_SECURITY">
  113. <synopsis>Raised when a request fails due to an internal memory allocation failure.</synopsis>
  114. <syntax>
  115. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  116. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  117. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  118. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  119. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  120. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  121. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  122. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  123. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  124. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  125. </syntax>
  126. </managerEventInstance>
  127. </managerEvent>
  128. <managerEvent language="en_US" name="LoadAverageLimit">
  129. <managerEventInstance class="EVENT_FLAG_SECURITY">
  130. <synopsis>Raised when a request fails because a configured load average limit has been reached.</synopsis>
  131. <syntax>
  132. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  133. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  134. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  135. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  136. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  137. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  138. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  139. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  140. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  141. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  142. </syntax>
  143. </managerEventInstance>
  144. </managerEvent>
  145. <managerEvent language="en_US" name="RequestNotSupported">
  146. <managerEventInstance class="EVENT_FLAG_SECURITY">
  147. <synopsis>Raised when a request fails due to some aspect of the requested item not being supported by the service.</synopsis>
  148. <syntax>
  149. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  150. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  151. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  152. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  153. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  154. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  155. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  156. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  157. <parameter name="RequestType">
  158. <para>The type of request attempted.</para>
  159. </parameter>
  160. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  161. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  162. </syntax>
  163. </managerEventInstance>
  164. </managerEvent>
  165. <managerEvent language="en_US" name="RequestNotAllowed">
  166. <managerEventInstance class="EVENT_FLAG_SECURITY">
  167. <synopsis>Raised when a request is not allowed by the service.</synopsis>
  168. <syntax>
  169. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  170. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  171. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  172. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  173. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  174. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  175. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  176. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  177. <xi:include xpointer="xpointer(/docs/managerEvent[@name='RequestNotSupported']/managerEventInstance/syntax/parameter[@name='RequestType'])" />
  178. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  179. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  180. <parameter name="RequestParams" required="false">
  181. <para>Parameters provided to the rejected request.</para>
  182. </parameter>
  183. </syntax>
  184. </managerEventInstance>
  185. </managerEvent>
  186. <managerEvent language="en_US" name="AuthMethodNotAllowed">
  187. <managerEventInstance class="EVENT_FLAG_SECURITY">
  188. <synopsis>Raised when a request used an authentication method not allowed by the service.</synopsis>
  189. <syntax>
  190. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  191. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  192. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  193. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  194. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  195. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  196. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  197. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  198. <parameter name="AuthMethod">
  199. <para>The authentication method attempted.</para>
  200. </parameter>
  201. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  202. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  203. </syntax>
  204. </managerEventInstance>
  205. </managerEvent>
  206. <managerEvent language="en_US" name="RequestBadFormat">
  207. <managerEventInstance class="EVENT_FLAG_SECURITY">
  208. <synopsis>Raised when a request is received with bad formatting.</synopsis>
  209. <syntax>
  210. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  211. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  212. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  213. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  214. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  215. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  216. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  217. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  218. <xi:include xpointer="xpointer(/docs/managerEvent[@name='RequestNotSupported']/managerEventInstance/syntax/parameter[@name='RequestType'])" />
  219. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  220. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  221. <parameter name="AccountID" required="false">
  222. <para>The account ID associated with the rejected request.</para>
  223. </parameter>
  224. <xi:include xpointer="xpointer(/docs/managerEvent[@name='RequestNotAllowed']/managerEventInstance/syntax/parameter[@name='RequestParams'])" />
  225. </syntax>
  226. </managerEventInstance>
  227. </managerEvent>
  228. <managerEvent language="en_US" name="SuccessfulAuth">
  229. <managerEventInstance class="EVENT_FLAG_SECURITY">
  230. <synopsis>Raised when a request successfully authenticates with a service.</synopsis>
  231. <syntax>
  232. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  233. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  234. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  235. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  236. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  237. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  238. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  239. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  240. <parameter name="UsingPassword">
  241. <para>Whether or not the authentication attempt included a password.</para>
  242. </parameter>
  243. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  244. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  245. </syntax>
  246. </managerEventInstance>
  247. </managerEvent>
  248. <managerEvent language="en_US" name="UnexpectedAddress">
  249. <managerEventInstance class="EVENT_FLAG_SECURITY">
  250. <synopsis>Raised when a request has a different source address then what is expected for a session already in progress with a service.</synopsis>
  251. <syntax>
  252. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  253. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  254. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  255. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  256. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  257. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  258. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  259. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  260. <parameter name="ExpectedAddress">
  261. <para>The address that the request was expected to use.</para>
  262. </parameter>
  263. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  264. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  265. </syntax>
  266. </managerEventInstance>
  267. </managerEvent>
  268. <managerEvent language="en_US" name="ChallengeResponseFailed">
  269. <managerEventInstance class="EVENT_FLAG_SECURITY">
  270. <synopsis>Raised when a request's attempt to authenticate has been challenged, and the request failed the authentication challenge.</synopsis>
  271. <syntax>
  272. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  273. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  274. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  275. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  276. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  277. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  278. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  279. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  280. <parameter name="Challenge">
  281. <para>The challenge that was sent.</para>
  282. </parameter>
  283. <parameter name="Response">
  284. <para>The response that was received.</para>
  285. </parameter>
  286. <parameter name="ExpectedResponse">
  287. <para>The expected response to the challenge.</para>
  288. </parameter>
  289. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  290. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  291. </syntax>
  292. </managerEventInstance>
  293. </managerEvent>
  294. <managerEvent language="en_US" name="InvalidPassword">
  295. <managerEventInstance class="EVENT_FLAG_SECURITY">
  296. <synopsis>Raised when a request provides an invalid password during an authentication attempt.</synopsis>
  297. <syntax>
  298. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  299. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  300. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  301. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  302. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  303. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  304. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  305. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  306. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  307. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  308. <parameter name="Challenge" required="false">
  309. <para>The challenge that was sent.</para>
  310. </parameter>
  311. <parameter name="ReceivedChallenge" required="false">
  312. <para>The challenge that was received.</para>
  313. </parameter>
  314. <parameter name="RecievedHash" required="false">
  315. <para>The hash that was received.</para>
  316. </parameter>
  317. </syntax>
  318. </managerEventInstance>
  319. </managerEvent>
  320. <managerEvent language="en_US" name="ChallengeSent">
  321. <managerEventInstance class="EVENT_FLAG_SECURITY">
  322. <synopsis>Raised when an Asterisk service sends an authentication challenge to a request.</synopsis>
  323. <syntax>
  324. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  325. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  326. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  327. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  328. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  329. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  330. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  331. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  332. <xi:include xpointer="xpointer(/docs/managerEvent[@name='ChallengeResponseFailed']/managerEventInstance/syntax/parameter[@name='Challenge'])" />
  333. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  334. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  335. </syntax>
  336. </managerEventInstance>
  337. </managerEvent>
  338. <managerEvent language="en_US" name="InvalidTransport">
  339. <managerEventInstance class="EVENT_FLAG_SECURITY">
  340. <synopsis>Raised when a request attempts to use a transport not allowed by the Asterisk service.</synopsis>
  341. <syntax>
  342. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventTV'])" />
  343. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Severity'])" />
  344. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Service'])" />
  345. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='EventVersion'])" />
  346. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='AccountID'])" />
  347. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionID'])" />
  348. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='LocalAddress'])" />
  349. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='RemoteAddress'])" />
  350. <parameter name="AttemptedTransport">
  351. <para>The transport type that the request attempted to use.</para>
  352. </parameter>
  353. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='Module'])" />
  354. <xi:include xpointer="xpointer(/docs/managerEvent[@name='FailedACL']/managerEventInstance/syntax/parameter[@name='SessionTV'])" />
  355. </syntax>
  356. </managerEventInstance>
  357. </managerEvent>
  358. ***/
  359. #include "asterisk.h"
  360. ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
  361. #include "asterisk/utils.h"
  362. #include "asterisk/strings.h"
  363. #include "asterisk/network.h"
  364. #include "asterisk/security_events.h"
  365. #include "asterisk/netsock2.h"
  366. #include "asterisk/stasis.h"
  367. #include "asterisk/json.h"
  368. #include "asterisk/astobj2.h"
  369. static const size_t TIMESTAMP_STR_LEN = 32;
  370. static const size_t SECURITY_EVENT_BUF_INIT_LEN = 256;
  371. /*! \brief Security Topic */
  372. static struct stasis_topic *security_topic;
  373. struct stasis_topic *ast_security_topic(void)
  374. {
  375. return security_topic;
  376. }
  377. static int append_event_str_single(struct ast_str **str, struct ast_json *json,
  378. const enum ast_event_ie_type ie_type)
  379. {
  380. const char *ie_type_key = ast_event_get_ie_type_name(ie_type);
  381. struct ast_json *json_string = ast_json_object_get(json, ie_type_key);
  382. if (!json_string) {
  383. return 0;
  384. }
  385. if (ast_str_append(str, 0, "%s: %s\r\n", ie_type_key, S_OR(ast_json_string_get(json_string), "")) == -1) {
  386. return -1;
  387. }
  388. return 0;
  389. }
  390. static int append_event_str_from_json(struct ast_str **str, struct ast_json *json,
  391. const struct ast_security_event_ie_type *ies)
  392. {
  393. unsigned int i;
  394. if (!ies) {
  395. return 0;
  396. }
  397. for (i = 0; ies[i].ie_type != AST_EVENT_IE_END; i++) {
  398. if (append_event_str_single(str, json, ies[i].ie_type)) {
  399. return -1;
  400. }
  401. }
  402. return 0;
  403. }
  404. static struct ast_manager_event_blob *security_event_to_ami_blob(struct ast_json *json)
  405. {
  406. RAII_VAR(struct ast_str *, str, NULL, ast_free);
  407. struct ast_json *event_type_json;
  408. enum ast_security_event_type event_type;
  409. event_type_json = ast_json_object_get(json, "SecurityEvent");
  410. event_type = ast_json_integer_get(event_type_json);
  411. ast_assert(event_type >= 0 && event_type < AST_SECURITY_EVENT_NUM_TYPES);
  412. if (!(str = ast_str_create(SECURITY_EVENT_BUF_INIT_LEN))) {
  413. return NULL;
  414. }
  415. if (append_event_str_from_json(&str, json,
  416. ast_security_event_get_required_ies(event_type))) {
  417. ast_log(AST_LOG_ERROR, "Failed to issue a security event to AMI: "
  418. "error occurred when adding required event fields.\n");
  419. return NULL;
  420. }
  421. if (append_event_str_from_json(&str, json,
  422. ast_security_event_get_optional_ies(event_type))) {
  423. ast_log(AST_LOG_ERROR, "Failed to issue a security event to AMI: "
  424. "error occurred when adding optional event fields.\n");
  425. return NULL;
  426. }
  427. return ast_manager_event_blob_create(EVENT_FLAG_SECURITY,
  428. ast_security_event_get_name(event_type),
  429. "%s",
  430. ast_str_buffer(str));
  431. }
  432. static struct ast_manager_event_blob *security_event_to_ami(struct stasis_message *message)
  433. {
  434. struct ast_json_payload *payload = stasis_message_data(message);
  435. if (stasis_message_type(message) != ast_security_event_type()) {
  436. return NULL;
  437. }
  438. if (!payload) {
  439. return NULL;
  440. }
  441. return security_event_to_ami_blob(payload->json);
  442. }
  443. /*! \brief Message type for security events */
  444. STASIS_MESSAGE_TYPE_DEFN(ast_security_event_type,
  445. .to_ami = security_event_to_ami,
  446. );
  447. static void security_stasis_cleanup(void)
  448. {
  449. ao2_cleanup(security_topic);
  450. security_topic = NULL;
  451. STASIS_MESSAGE_TYPE_CLEANUP(ast_security_event_type);
  452. }
  453. int ast_security_stasis_init(void)
  454. {
  455. ast_register_cleanup(security_stasis_cleanup);
  456. security_topic = stasis_topic_create("ast_security");
  457. if (!security_topic) {
  458. return -1;
  459. }
  460. if (STASIS_MESSAGE_TYPE_INIT(ast_security_event_type)) {
  461. return -1;
  462. }
  463. return 0;
  464. }
  465. static const struct {
  466. const char *name;
  467. uint32_t version;
  468. enum ast_security_event_severity severity;
  469. #define MAX_SECURITY_IES 12
  470. struct ast_security_event_ie_type required_ies[MAX_SECURITY_IES];
  471. struct ast_security_event_ie_type optional_ies[MAX_SECURITY_IES];
  472. #undef MAX_SECURITY_IES
  473. } sec_events[AST_SECURITY_EVENT_NUM_TYPES] = {
  474. #define SEC_EVT_FIELD(e, field) (offsetof(struct ast_security_event_##e, field))
  475. [AST_SECURITY_EVENT_FAILED_ACL] = {
  476. .name = "FailedACL",
  477. .version = AST_SECURITY_EVENT_FAILED_ACL_VERSION,
  478. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  479. .required_ies = {
  480. { AST_EVENT_IE_EVENT_TV, 0 },
  481. { AST_EVENT_IE_SEVERITY, 0 },
  482. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  483. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  484. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  485. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  486. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  487. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  488. { AST_EVENT_IE_END, 0 }
  489. },
  490. .optional_ies = {
  491. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  492. { AST_EVENT_IE_ACL_NAME, SEC_EVT_FIELD(failed_acl, acl_name) },
  493. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  494. { AST_EVENT_IE_END, 0 }
  495. },
  496. },
  497. [AST_SECURITY_EVENT_INVAL_ACCT_ID] = {
  498. .name = "InvalidAccountID",
  499. .version = AST_SECURITY_EVENT_INVAL_ACCT_ID_VERSION,
  500. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  501. .required_ies = {
  502. { AST_EVENT_IE_EVENT_TV, 0 },
  503. { AST_EVENT_IE_SEVERITY, 0 },
  504. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  505. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  506. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  507. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  508. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  509. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  510. { AST_EVENT_IE_END, 0 }
  511. },
  512. .optional_ies = {
  513. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  514. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  515. { AST_EVENT_IE_END, 0 }
  516. },
  517. },
  518. [AST_SECURITY_EVENT_SESSION_LIMIT] = {
  519. .name = "SessionLimit",
  520. .version = AST_SECURITY_EVENT_SESSION_LIMIT_VERSION,
  521. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  522. .required_ies = {
  523. { AST_EVENT_IE_EVENT_TV, 0 },
  524. { AST_EVENT_IE_SEVERITY, 0 },
  525. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  526. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  527. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  528. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  529. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  530. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  531. { AST_EVENT_IE_END, 0 }
  532. },
  533. .optional_ies = {
  534. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  535. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  536. { AST_EVENT_IE_END, 0 }
  537. },
  538. },
  539. [AST_SECURITY_EVENT_MEM_LIMIT] = {
  540. .name = "MemoryLimit",
  541. .version = AST_SECURITY_EVENT_MEM_LIMIT_VERSION,
  542. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  543. .required_ies = {
  544. { AST_EVENT_IE_EVENT_TV, 0 },
  545. { AST_EVENT_IE_SEVERITY, 0 },
  546. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  547. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  548. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  549. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  550. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  551. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  552. { AST_EVENT_IE_END, 0 }
  553. },
  554. .optional_ies = {
  555. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  556. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  557. { AST_EVENT_IE_END, 0 }
  558. },
  559. },
  560. [AST_SECURITY_EVENT_LOAD_AVG] = {
  561. .name = "LoadAverageLimit",
  562. .version = AST_SECURITY_EVENT_LOAD_AVG_VERSION,
  563. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  564. .required_ies = {
  565. { AST_EVENT_IE_EVENT_TV, 0 },
  566. { AST_EVENT_IE_SEVERITY, 0 },
  567. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  568. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  569. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  570. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  571. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  572. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  573. { AST_EVENT_IE_END, 0 }
  574. },
  575. .optional_ies = {
  576. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  577. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  578. { AST_EVENT_IE_END, 0 }
  579. },
  580. },
  581. [AST_SECURITY_EVENT_REQ_NO_SUPPORT] = {
  582. .name = "RequestNotSupported",
  583. .version = AST_SECURITY_EVENT_REQ_NO_SUPPORT_VERSION,
  584. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  585. .required_ies = {
  586. { AST_EVENT_IE_EVENT_TV, 0 },
  587. { AST_EVENT_IE_SEVERITY, 0 },
  588. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  589. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  590. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  591. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  592. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  593. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  594. { AST_EVENT_IE_REQUEST_TYPE, SEC_EVT_FIELD(req_no_support, request_type) },
  595. { AST_EVENT_IE_END, 0 }
  596. },
  597. .optional_ies = {
  598. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  599. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  600. { AST_EVENT_IE_END, 0 }
  601. },
  602. },
  603. [AST_SECURITY_EVENT_REQ_NOT_ALLOWED] = {
  604. .name = "RequestNotAllowed",
  605. .version = AST_SECURITY_EVENT_REQ_NOT_ALLOWED_VERSION,
  606. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  607. .required_ies = {
  608. { AST_EVENT_IE_EVENT_TV, 0 },
  609. { AST_EVENT_IE_SEVERITY, 0 },
  610. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  611. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  612. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  613. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  614. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  615. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  616. { AST_EVENT_IE_REQUEST_TYPE, SEC_EVT_FIELD(req_not_allowed, request_type) },
  617. { AST_EVENT_IE_END, 0 }
  618. },
  619. .optional_ies = {
  620. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  621. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  622. { AST_EVENT_IE_REQUEST_PARAMS, SEC_EVT_FIELD(req_not_allowed, request_params) },
  623. { AST_EVENT_IE_END, 0 }
  624. },
  625. },
  626. [AST_SECURITY_EVENT_AUTH_METHOD_NOT_ALLOWED] = {
  627. .name = "AuthMethodNotAllowed",
  628. .version = AST_SECURITY_EVENT_AUTH_METHOD_NOT_ALLOWED_VERSION,
  629. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  630. .required_ies = {
  631. { AST_EVENT_IE_EVENT_TV, 0 },
  632. { AST_EVENT_IE_SEVERITY, 0 },
  633. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  634. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  635. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  636. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  637. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  638. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  639. { AST_EVENT_IE_AUTH_METHOD, SEC_EVT_FIELD(auth_method_not_allowed, auth_method) },
  640. { AST_EVENT_IE_END, 0 }
  641. },
  642. .optional_ies = {
  643. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  644. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  645. { AST_EVENT_IE_END, 0 }
  646. },
  647. },
  648. [AST_SECURITY_EVENT_REQ_BAD_FORMAT] = {
  649. .name = "RequestBadFormat",
  650. .version = AST_SECURITY_EVENT_REQ_BAD_FORMAT_VERSION,
  651. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  652. .required_ies = {
  653. { AST_EVENT_IE_EVENT_TV, 0 },
  654. { AST_EVENT_IE_SEVERITY, 0 },
  655. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  656. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  657. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  658. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  659. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  660. { AST_EVENT_IE_REQUEST_TYPE, SEC_EVT_FIELD(req_bad_format, request_type) },
  661. { AST_EVENT_IE_END, 0 }
  662. },
  663. .optional_ies = {
  664. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  665. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  666. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  667. { AST_EVENT_IE_REQUEST_PARAMS, SEC_EVT_FIELD(req_bad_format, request_params) },
  668. { AST_EVENT_IE_END, 0 }
  669. },
  670. },
  671. [AST_SECURITY_EVENT_SUCCESSFUL_AUTH] = {
  672. .name = "SuccessfulAuth",
  673. .version = AST_SECURITY_EVENT_SUCCESSFUL_AUTH_VERSION,
  674. .severity = AST_SECURITY_EVENT_SEVERITY_INFO,
  675. .required_ies = {
  676. { AST_EVENT_IE_EVENT_TV, 0 },
  677. { AST_EVENT_IE_SEVERITY, 0 },
  678. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  679. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  680. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  681. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  682. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  683. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  684. { AST_EVENT_IE_USING_PASSWORD, SEC_EVT_FIELD(successful_auth, using_password) },
  685. { AST_EVENT_IE_END, 0 }
  686. },
  687. .optional_ies = {
  688. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  689. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  690. { AST_EVENT_IE_END, 0 }
  691. },
  692. },
  693. [AST_SECURITY_EVENT_UNEXPECTED_ADDR] = {
  694. .name = "UnexpectedAddress",
  695. .version = AST_SECURITY_EVENT_UNEXPECTED_ADDR_VERSION,
  696. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  697. .required_ies = {
  698. { AST_EVENT_IE_EVENT_TV, 0 },
  699. { AST_EVENT_IE_SEVERITY, 0 },
  700. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  701. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  702. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  703. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  704. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  705. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  706. { AST_EVENT_IE_EXPECTED_ADDR, SEC_EVT_FIELD(unexpected_addr, expected_addr) },
  707. { AST_EVENT_IE_END, 0 }
  708. },
  709. .optional_ies = {
  710. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  711. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  712. { AST_EVENT_IE_END, 0 }
  713. },
  714. },
  715. [AST_SECURITY_EVENT_CHAL_RESP_FAILED] = {
  716. .name = "ChallengeResponseFailed",
  717. .version = AST_SECURITY_EVENT_CHAL_RESP_FAILED_VERSION,
  718. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  719. .required_ies = {
  720. { AST_EVENT_IE_EVENT_TV, 0 },
  721. { AST_EVENT_IE_SEVERITY, 0 },
  722. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  723. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  724. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  725. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  726. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  727. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  728. { AST_EVENT_IE_CHALLENGE, SEC_EVT_FIELD(chal_resp_failed, challenge) },
  729. { AST_EVENT_IE_RESPONSE, SEC_EVT_FIELD(chal_resp_failed, response) },
  730. { AST_EVENT_IE_EXPECTED_RESPONSE, SEC_EVT_FIELD(chal_resp_failed, expected_response) },
  731. { AST_EVENT_IE_END, 0 }
  732. },
  733. .optional_ies = {
  734. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  735. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  736. { AST_EVENT_IE_END, 0 }
  737. },
  738. },
  739. [AST_SECURITY_EVENT_INVAL_PASSWORD] = {
  740. .name = "InvalidPassword",
  741. .version = AST_SECURITY_EVENT_INVAL_PASSWORD_VERSION,
  742. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  743. .required_ies = {
  744. { AST_EVENT_IE_EVENT_TV, 0 },
  745. { AST_EVENT_IE_SEVERITY, 0 },
  746. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  747. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  748. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  749. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  750. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  751. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  752. { AST_EVENT_IE_END, 0 }
  753. },
  754. .optional_ies = {
  755. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  756. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  757. { AST_EVENT_IE_CHALLENGE, SEC_EVT_FIELD(inval_password, challenge) },
  758. { AST_EVENT_IE_RECEIVED_CHALLENGE, SEC_EVT_FIELD(inval_password, received_challenge) },
  759. { AST_EVENT_IE_RECEIVED_HASH, SEC_EVT_FIELD(inval_password, received_hash) },
  760. { AST_EVENT_IE_END, 0 }
  761. },
  762. },
  763. [AST_SECURITY_EVENT_CHAL_SENT] = {
  764. .name = "ChallengeSent",
  765. .version = AST_SECURITY_EVENT_CHAL_SENT_VERSION,
  766. .severity = AST_SECURITY_EVENT_SEVERITY_INFO,
  767. .required_ies = {
  768. { AST_EVENT_IE_EVENT_TV, 0 },
  769. { AST_EVENT_IE_SEVERITY, 0 },
  770. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  771. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  772. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  773. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  774. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  775. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  776. { AST_EVENT_IE_CHALLENGE, SEC_EVT_FIELD(chal_sent, challenge) },
  777. { AST_EVENT_IE_END, 0 }
  778. },
  779. .optional_ies = {
  780. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  781. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  782. { AST_EVENT_IE_END, 0 }
  783. },
  784. },
  785. [AST_SECURITY_EVENT_INVAL_TRANSPORT] = {
  786. .name = "InvalidTransport",
  787. .version = AST_SECURITY_EVENT_INVAL_TRANSPORT_VERSION,
  788. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  789. .required_ies = {
  790. { AST_EVENT_IE_EVENT_TV, 0 },
  791. { AST_EVENT_IE_SEVERITY, 0 },
  792. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  793. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  794. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  795. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  796. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  797. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  798. { AST_EVENT_IE_ATTEMPTED_TRANSPORT, SEC_EVT_FIELD(inval_transport, transport) },
  799. { AST_EVENT_IE_END, 0 }
  800. },
  801. .optional_ies = {
  802. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  803. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  804. { AST_EVENT_IE_END, 0 }
  805. },
  806. },
  807. #undef SEC_EVT_FIELD
  808. };
  809. static const struct {
  810. enum ast_security_event_severity severity;
  811. const char *str;
  812. } severities[] = {
  813. { AST_SECURITY_EVENT_SEVERITY_INFO, "Informational" },
  814. { AST_SECURITY_EVENT_SEVERITY_ERROR, "Error" },
  815. };
  816. const char *ast_security_event_severity_get_name(
  817. const enum ast_security_event_severity severity)
  818. {
  819. unsigned int i;
  820. for (i = 0; i < ARRAY_LEN(severities); i++) {
  821. if (severities[i].severity == severity) {
  822. return severities[i].str;
  823. }
  824. }
  825. return NULL;
  826. }
  827. static int check_event_type(const enum ast_security_event_type event_type)
  828. {
  829. if (event_type < 0 || event_type >= AST_SECURITY_EVENT_NUM_TYPES) {
  830. ast_log(LOG_ERROR, "Invalid security event type %u\n", event_type);
  831. return -1;
  832. }
  833. return 0;
  834. }
  835. const char *ast_security_event_get_name(const enum ast_security_event_type event_type)
  836. {
  837. if (check_event_type(event_type)) {
  838. return NULL;
  839. }
  840. return sec_events[event_type].name;
  841. }
  842. const struct ast_security_event_ie_type *ast_security_event_get_required_ies(
  843. const enum ast_security_event_type event_type)
  844. {
  845. if (check_event_type(event_type)) {
  846. return NULL;
  847. }
  848. return sec_events[event_type].required_ies;
  849. }
  850. const struct ast_security_event_ie_type *ast_security_event_get_optional_ies(
  851. const enum ast_security_event_type event_type)
  852. {
  853. if (check_event_type(event_type)) {
  854. return NULL;
  855. }
  856. return sec_events[event_type].optional_ies;
  857. }
  858. static int add_ip_json_object(struct ast_json *json, enum ast_event_ie_type ie_type,
  859. const struct ast_security_event_ip_addr *addr)
  860. {
  861. struct ast_json *json_ip;
  862. json_ip = ast_json_ipaddr(addr->addr, addr->transport);
  863. if (!json_ip) {
  864. return -1;
  865. }
  866. return ast_json_object_set(json, ast_event_get_ie_type_name(ie_type), json_ip);
  867. }
  868. enum ie_required {
  869. NOT_REQUIRED,
  870. REQUIRED
  871. };
  872. static int add_json_object(struct ast_json *json, const struct ast_security_event_common *sec,
  873. const struct ast_security_event_ie_type *ie_type, enum ie_required req)
  874. {
  875. int res = 0;
  876. switch (ie_type->ie_type) {
  877. case AST_EVENT_IE_SERVICE:
  878. case AST_EVENT_IE_ACCOUNT_ID:
  879. case AST_EVENT_IE_SESSION_ID:
  880. case AST_EVENT_IE_MODULE:
  881. case AST_EVENT_IE_ACL_NAME:
  882. case AST_EVENT_IE_REQUEST_TYPE:
  883. case AST_EVENT_IE_REQUEST_PARAMS:
  884. case AST_EVENT_IE_AUTH_METHOD:
  885. case AST_EVENT_IE_CHALLENGE:
  886. case AST_EVENT_IE_RESPONSE:
  887. case AST_EVENT_IE_EXPECTED_RESPONSE:
  888. case AST_EVENT_IE_RECEIVED_CHALLENGE:
  889. case AST_EVENT_IE_RECEIVED_HASH:
  890. case AST_EVENT_IE_ATTEMPTED_TRANSPORT:
  891. {
  892. const char *str;
  893. struct ast_json *json_string;
  894. str = *((const char **)(((const char *) sec) + ie_type->offset));
  895. if (req && !str) {
  896. ast_log(LOG_WARNING, "Required IE '%d' for security event "
  897. "type '%u' not present\n", ie_type->ie_type,
  898. sec->event_type);
  899. res = -1;
  900. break;
  901. }
  902. if (!str) {
  903. break;
  904. }
  905. json_string = ast_json_string_create(str);
  906. if (!json_string) {
  907. res = -1;
  908. break;
  909. }
  910. res = ast_json_object_set(json, ast_event_get_ie_type_name(ie_type->ie_type), json_string);
  911. break;
  912. }
  913. case AST_EVENT_IE_EVENT_VERSION:
  914. case AST_EVENT_IE_USING_PASSWORD:
  915. {
  916. struct ast_json *json_string;
  917. uint32_t val;
  918. val = *((const uint32_t *)(((const char *) sec) + ie_type->offset));
  919. json_string = ast_json_stringf("%u", val);
  920. if (!json_string) {
  921. res = -1;
  922. break;
  923. }
  924. res = ast_json_object_set(json, ast_event_get_ie_type_name(ie_type->ie_type), json_string);
  925. break;
  926. }
  927. case AST_EVENT_IE_LOCAL_ADDR:
  928. case AST_EVENT_IE_REMOTE_ADDR:
  929. case AST_EVENT_IE_EXPECTED_ADDR:
  930. {
  931. const struct ast_security_event_ip_addr *addr;
  932. addr = (const struct ast_security_event_ip_addr *)(((const char *) sec) + ie_type->offset);
  933. if (req && !addr->addr) {
  934. ast_log(LOG_WARNING, "Required IE '%d' for security event "
  935. "type '%u' not present\n", ie_type->ie_type,
  936. sec->event_type);
  937. res = -1;
  938. }
  939. if (addr->addr) {
  940. res = add_ip_json_object(json, ie_type->ie_type, addr);
  941. }
  942. break;
  943. }
  944. case AST_EVENT_IE_SESSION_TV:
  945. {
  946. const struct timeval *tval;
  947. tval = *((const struct timeval **)(((const char *) sec) + ie_type->offset));
  948. if (req && !tval) {
  949. ast_log(LOG_WARNING, "Required IE '%d' for security event "
  950. "type '%u' not present\n", ie_type->ie_type,
  951. sec->event_type);
  952. res = -1;
  953. }
  954. if (tval) {
  955. struct ast_json *json_tval = ast_json_timeval(*tval, NULL);
  956. if (!json_tval) {
  957. res = -1;
  958. break;
  959. }
  960. res = ast_json_object_set(json, ast_event_get_ie_type_name(ie_type->ie_type), json_tval);
  961. }
  962. break;
  963. }
  964. case AST_EVENT_IE_EVENT_TV:
  965. case AST_EVENT_IE_SEVERITY:
  966. /* Added automatically, nothing to do here. */
  967. break;
  968. default:
  969. ast_log(LOG_WARNING, "Unhandled IE type '%d', this security event "
  970. "will be missing data.\n", ie_type->ie_type);
  971. break;
  972. }
  973. return res;
  974. }
  975. static struct ast_json *alloc_security_event_json_object(const struct ast_security_event_common *sec)
  976. {
  977. struct timeval tv = ast_tvnow();
  978. const char *severity_str;
  979. struct ast_json *json_temp;
  980. RAII_VAR(struct ast_json *, json_object, ast_json_object_create(), ast_json_unref);
  981. if (!json_object) {
  982. return NULL;
  983. }
  984. /* NOTE: Every time ast_json_object_set is used, json_temp becomes a stale pointer since the reference is taken.
  985. * This is true even if ast_json_object_set fails.
  986. */
  987. json_temp = ast_json_integer_create(sec->event_type);
  988. if (!json_temp || ast_json_object_set(json_object, "SecurityEvent", json_temp)) {
  989. return NULL;
  990. }
  991. json_temp = ast_json_stringf("%u", sec->version);
  992. if (!json_temp || ast_json_object_set(json_object, ast_event_get_ie_type_name(AST_EVENT_IE_EVENT_VERSION), json_temp)) {
  993. return NULL;
  994. }
  995. /* AST_EVENT_IE_EVENT_TV */
  996. json_temp = ast_json_timeval(tv, NULL);
  997. if (!json_temp || ast_json_object_set(json_object, ast_event_get_ie_type_name(AST_EVENT_IE_EVENT_TV), json_temp)) {
  998. return NULL;
  999. }
  1000. /* AST_EVENT_IE_SERVICE */
  1001. json_temp = ast_json_string_create(sec->service);
  1002. if (!json_temp || ast_json_object_set(json_object, ast_event_get_ie_type_name(AST_EVENT_IE_SERVICE), json_temp)) {
  1003. return NULL;
  1004. }
  1005. /* AST_EVENT_IE_SEVERITY */
  1006. severity_str = S_OR(
  1007. ast_security_event_severity_get_name(sec_events[sec->event_type].severity),
  1008. "Unknown"
  1009. );
  1010. json_temp = ast_json_string_create(severity_str);
  1011. if (!json_temp || ast_json_object_set(json_object, ast_event_get_ie_type_name(AST_EVENT_IE_SEVERITY), json_temp)) {
  1012. return NULL;
  1013. }
  1014. return ast_json_ref(json_object);
  1015. }
  1016. static int handle_security_event(const struct ast_security_event_common *sec)
  1017. {
  1018. RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
  1019. RAII_VAR(struct ast_json_payload *, json_payload, NULL, ao2_cleanup);
  1020. RAII_VAR(struct ast_json *, json_object, NULL, ast_json_unref);
  1021. const struct ast_security_event_ie_type *ies;
  1022. unsigned int i;
  1023. json_object = alloc_security_event_json_object(sec);
  1024. if (!json_object) {
  1025. return -1;
  1026. }
  1027. for (ies = ast_security_event_get_required_ies(sec->event_type), i = 0;
  1028. ies[i].ie_type != AST_EVENT_IE_END;
  1029. i++) {
  1030. if (add_json_object(json_object, sec, ies + i, REQUIRED)) {
  1031. goto return_error;
  1032. }
  1033. }
  1034. for (ies = ast_security_event_get_optional_ies(sec->event_type), i = 0;
  1035. ies[i].ie_type != AST_EVENT_IE_END;
  1036. i++) {
  1037. if (add_json_object(json_object, sec, ies + i, NOT_REQUIRED)) {
  1038. goto return_error;
  1039. }
  1040. }
  1041. /* The json blob is ready. Throw it in the payload and send it out over stasis. */
  1042. if (!(json_payload = ast_json_payload_create(json_object))) {
  1043. goto return_error;
  1044. }
  1045. msg = stasis_message_create(ast_security_event_type(), json_payload);
  1046. if (!msg) {
  1047. goto return_error;
  1048. }
  1049. stasis_publish(ast_security_topic(), msg);
  1050. return 0;
  1051. return_error:
  1052. return -1;
  1053. }
  1054. int ast_security_event_report(const struct ast_security_event_common *sec)
  1055. {
  1056. if (sec->event_type < 0 || sec->event_type >= AST_SECURITY_EVENT_NUM_TYPES) {
  1057. ast_log(LOG_ERROR, "Invalid security event type\n");
  1058. return -1;
  1059. }
  1060. if (!sec_events[sec->event_type].name) {
  1061. ast_log(LOG_WARNING, "Security event type %u not handled\n",
  1062. sec->event_type);
  1063. return -1;
  1064. }
  1065. if (sec->version != sec_events[sec->event_type].version) {
  1066. ast_log(LOG_WARNING, "Security event %u version mismatch\n",
  1067. sec->event_type);
  1068. return -1;
  1069. }
  1070. if (handle_security_event(sec)) {
  1071. ast_log(LOG_ERROR, "Failed to issue security event of type %s.\n",
  1072. ast_security_event_get_name(sec->event_type));
  1073. }
  1074. return 0;
  1075. }