security_events.c 53 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196
  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="ReceivedHash" 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. #include "asterisk/utils.h"
  361. #include "asterisk/strings.h"
  362. #include "asterisk/network.h"
  363. #include "asterisk/event.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 SECURITY_EVENT_BUF_INIT_LEN = 256;
  370. /*! \brief Security Topic */
  371. static struct stasis_topic *security_topic;
  372. struct stasis_topic *ast_security_topic(void)
  373. {
  374. return security_topic;
  375. }
  376. static int append_event_str_single(struct ast_str **str, struct ast_json *json,
  377. const enum ast_event_ie_type ie_type)
  378. {
  379. const char *ie_type_key = ast_event_get_ie_type_name(ie_type);
  380. struct ast_json *json_string = ast_json_object_get(json, ie_type_key);
  381. if (!json_string) {
  382. return 0;
  383. }
  384. if (ast_str_append(str, 0, "%s: %s\r\n", ie_type_key, S_OR(ast_json_string_get(json_string), "")) == -1) {
  385. return -1;
  386. }
  387. return 0;
  388. }
  389. static int append_event_str_from_json(struct ast_str **str, struct ast_json *json,
  390. const struct ast_security_event_ie_type *ies)
  391. {
  392. unsigned int i;
  393. if (!ies) {
  394. return 0;
  395. }
  396. for (i = 0; ies[i].ie_type != AST_EVENT_IE_END; i++) {
  397. if (append_event_str_single(str, json, ies[i].ie_type)) {
  398. return -1;
  399. }
  400. }
  401. return 0;
  402. }
  403. static struct ast_manager_event_blob *security_event_to_ami_blob(struct ast_json *json)
  404. {
  405. RAII_VAR(struct ast_str *, str, NULL, ast_free);
  406. struct ast_json *event_type_json;
  407. enum ast_security_event_type event_type;
  408. event_type_json = ast_json_object_get(json, "SecurityEvent");
  409. event_type = ast_json_integer_get(event_type_json);
  410. ast_assert((unsigned int)event_type < AST_SECURITY_EVENT_NUM_TYPES);
  411. if (!(str = ast_str_create(SECURITY_EVENT_BUF_INIT_LEN))) {
  412. return NULL;
  413. }
  414. if (append_event_str_from_json(&str, json,
  415. ast_security_event_get_required_ies(event_type))) {
  416. ast_log(AST_LOG_ERROR, "Failed to issue a security event to AMI: "
  417. "error occurred when adding required event fields.\n");
  418. return NULL;
  419. }
  420. if (append_event_str_from_json(&str, json,
  421. ast_security_event_get_optional_ies(event_type))) {
  422. ast_log(AST_LOG_ERROR, "Failed to issue a security event to AMI: "
  423. "error occurred when adding optional event fields.\n");
  424. return NULL;
  425. }
  426. return ast_manager_event_blob_create(EVENT_FLAG_SECURITY,
  427. ast_security_event_get_name(event_type),
  428. "%s",
  429. ast_str_buffer(str));
  430. }
  431. static struct ast_manager_event_blob *security_event_to_ami(struct stasis_message *message)
  432. {
  433. struct ast_json_payload *payload = stasis_message_data(message);
  434. if (stasis_message_type(message) != ast_security_event_type()) {
  435. return NULL;
  436. }
  437. if (!payload) {
  438. return NULL;
  439. }
  440. return security_event_to_ami_blob(payload->json);
  441. }
  442. /*! \brief Message type for security events */
  443. STASIS_MESSAGE_TYPE_DEFN(ast_security_event_type,
  444. .to_ami = security_event_to_ami,
  445. );
  446. static void security_stasis_cleanup(void)
  447. {
  448. ao2_cleanup(security_topic);
  449. security_topic = NULL;
  450. STASIS_MESSAGE_TYPE_CLEANUP(ast_security_event_type);
  451. }
  452. int ast_security_stasis_init(void)
  453. {
  454. ast_register_cleanup(security_stasis_cleanup);
  455. security_topic = stasis_topic_create("security:all");
  456. if (!security_topic) {
  457. return -1;
  458. }
  459. if (STASIS_MESSAGE_TYPE_INIT(ast_security_event_type)) {
  460. return -1;
  461. }
  462. return 0;
  463. }
  464. static const struct {
  465. const char *name;
  466. uint32_t version;
  467. enum ast_security_event_severity severity;
  468. #define MAX_SECURITY_IES 12
  469. struct ast_security_event_ie_type required_ies[MAX_SECURITY_IES];
  470. struct ast_security_event_ie_type optional_ies[MAX_SECURITY_IES];
  471. #undef MAX_SECURITY_IES
  472. } sec_events[AST_SECURITY_EVENT_NUM_TYPES] = {
  473. #define SEC_EVT_FIELD(e, field) (offsetof(struct ast_security_event_##e, field))
  474. [AST_SECURITY_EVENT_FAILED_ACL] = {
  475. .name = "FailedACL",
  476. .version = AST_SECURITY_EVENT_FAILED_ACL_VERSION,
  477. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  478. .required_ies = {
  479. { AST_EVENT_IE_EVENT_TV, 0 },
  480. { AST_EVENT_IE_SEVERITY, 0 },
  481. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  482. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  483. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  484. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  485. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  486. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  487. { AST_EVENT_IE_END, 0 }
  488. },
  489. .optional_ies = {
  490. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  491. { AST_EVENT_IE_ACL_NAME, SEC_EVT_FIELD(failed_acl, acl_name) },
  492. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  493. { AST_EVENT_IE_END, 0 }
  494. },
  495. },
  496. [AST_SECURITY_EVENT_INVAL_ACCT_ID] = {
  497. .name = "InvalidAccountID",
  498. .version = AST_SECURITY_EVENT_INVAL_ACCT_ID_VERSION,
  499. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  500. .required_ies = {
  501. { AST_EVENT_IE_EVENT_TV, 0 },
  502. { AST_EVENT_IE_SEVERITY, 0 },
  503. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  504. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  505. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  506. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  507. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  508. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  509. { AST_EVENT_IE_END, 0 }
  510. },
  511. .optional_ies = {
  512. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  513. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  514. { AST_EVENT_IE_END, 0 }
  515. },
  516. },
  517. [AST_SECURITY_EVENT_SESSION_LIMIT] = {
  518. .name = "SessionLimit",
  519. .version = AST_SECURITY_EVENT_SESSION_LIMIT_VERSION,
  520. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  521. .required_ies = {
  522. { AST_EVENT_IE_EVENT_TV, 0 },
  523. { AST_EVENT_IE_SEVERITY, 0 },
  524. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  525. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  526. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  527. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  528. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  529. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  530. { AST_EVENT_IE_END, 0 }
  531. },
  532. .optional_ies = {
  533. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  534. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  535. { AST_EVENT_IE_END, 0 }
  536. },
  537. },
  538. [AST_SECURITY_EVENT_MEM_LIMIT] = {
  539. .name = "MemoryLimit",
  540. .version = AST_SECURITY_EVENT_MEM_LIMIT_VERSION,
  541. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  542. .required_ies = {
  543. { AST_EVENT_IE_EVENT_TV, 0 },
  544. { AST_EVENT_IE_SEVERITY, 0 },
  545. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  546. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  547. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  548. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  549. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  550. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  551. { AST_EVENT_IE_END, 0 }
  552. },
  553. .optional_ies = {
  554. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  555. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  556. { AST_EVENT_IE_END, 0 }
  557. },
  558. },
  559. [AST_SECURITY_EVENT_LOAD_AVG] = {
  560. .name = "LoadAverageLimit",
  561. .version = AST_SECURITY_EVENT_LOAD_AVG_VERSION,
  562. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  563. .required_ies = {
  564. { AST_EVENT_IE_EVENT_TV, 0 },
  565. { AST_EVENT_IE_SEVERITY, 0 },
  566. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  567. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  568. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  569. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  570. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  571. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  572. { AST_EVENT_IE_END, 0 }
  573. },
  574. .optional_ies = {
  575. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  576. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  577. { AST_EVENT_IE_END, 0 }
  578. },
  579. },
  580. [AST_SECURITY_EVENT_REQ_NO_SUPPORT] = {
  581. .name = "RequestNotSupported",
  582. .version = AST_SECURITY_EVENT_REQ_NO_SUPPORT_VERSION,
  583. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  584. .required_ies = {
  585. { AST_EVENT_IE_EVENT_TV, 0 },
  586. { AST_EVENT_IE_SEVERITY, 0 },
  587. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  588. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  589. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  590. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  591. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  592. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  593. { AST_EVENT_IE_REQUEST_TYPE, SEC_EVT_FIELD(req_no_support, request_type) },
  594. { AST_EVENT_IE_END, 0 }
  595. },
  596. .optional_ies = {
  597. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  598. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  599. { AST_EVENT_IE_END, 0 }
  600. },
  601. },
  602. [AST_SECURITY_EVENT_REQ_NOT_ALLOWED] = {
  603. .name = "RequestNotAllowed",
  604. .version = AST_SECURITY_EVENT_REQ_NOT_ALLOWED_VERSION,
  605. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  606. .required_ies = {
  607. { AST_EVENT_IE_EVENT_TV, 0 },
  608. { AST_EVENT_IE_SEVERITY, 0 },
  609. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  610. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  611. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  612. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  613. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  614. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  615. { AST_EVENT_IE_REQUEST_TYPE, SEC_EVT_FIELD(req_not_allowed, request_type) },
  616. { AST_EVENT_IE_END, 0 }
  617. },
  618. .optional_ies = {
  619. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  620. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  621. { AST_EVENT_IE_REQUEST_PARAMS, SEC_EVT_FIELD(req_not_allowed, request_params) },
  622. { AST_EVENT_IE_END, 0 }
  623. },
  624. },
  625. [AST_SECURITY_EVENT_AUTH_METHOD_NOT_ALLOWED] = {
  626. .name = "AuthMethodNotAllowed",
  627. .version = AST_SECURITY_EVENT_AUTH_METHOD_NOT_ALLOWED_VERSION,
  628. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  629. .required_ies = {
  630. { AST_EVENT_IE_EVENT_TV, 0 },
  631. { AST_EVENT_IE_SEVERITY, 0 },
  632. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  633. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  634. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  635. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  636. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  637. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  638. { AST_EVENT_IE_AUTH_METHOD, SEC_EVT_FIELD(auth_method_not_allowed, auth_method) },
  639. { AST_EVENT_IE_END, 0 }
  640. },
  641. .optional_ies = {
  642. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  643. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  644. { AST_EVENT_IE_END, 0 }
  645. },
  646. },
  647. [AST_SECURITY_EVENT_REQ_BAD_FORMAT] = {
  648. .name = "RequestBadFormat",
  649. .version = AST_SECURITY_EVENT_REQ_BAD_FORMAT_VERSION,
  650. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  651. .required_ies = {
  652. { AST_EVENT_IE_EVENT_TV, 0 },
  653. { AST_EVENT_IE_SEVERITY, 0 },
  654. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  655. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  656. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  657. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  658. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  659. { AST_EVENT_IE_REQUEST_TYPE, SEC_EVT_FIELD(req_bad_format, request_type) },
  660. { AST_EVENT_IE_END, 0 }
  661. },
  662. .optional_ies = {
  663. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  664. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  665. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  666. { AST_EVENT_IE_REQUEST_PARAMS, SEC_EVT_FIELD(req_bad_format, request_params) },
  667. { AST_EVENT_IE_END, 0 }
  668. },
  669. },
  670. [AST_SECURITY_EVENT_SUCCESSFUL_AUTH] = {
  671. .name = "SuccessfulAuth",
  672. .version = AST_SECURITY_EVENT_SUCCESSFUL_AUTH_VERSION,
  673. .severity = AST_SECURITY_EVENT_SEVERITY_INFO,
  674. .required_ies = {
  675. { AST_EVENT_IE_EVENT_TV, 0 },
  676. { AST_EVENT_IE_SEVERITY, 0 },
  677. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  678. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  679. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  680. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  681. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  682. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  683. { AST_EVENT_IE_USING_PASSWORD, SEC_EVT_FIELD(successful_auth, using_password) },
  684. { AST_EVENT_IE_END, 0 }
  685. },
  686. .optional_ies = {
  687. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  688. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  689. { AST_EVENT_IE_END, 0 }
  690. },
  691. },
  692. [AST_SECURITY_EVENT_UNEXPECTED_ADDR] = {
  693. .name = "UnexpectedAddress",
  694. .version = AST_SECURITY_EVENT_UNEXPECTED_ADDR_VERSION,
  695. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  696. .required_ies = {
  697. { AST_EVENT_IE_EVENT_TV, 0 },
  698. { AST_EVENT_IE_SEVERITY, 0 },
  699. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  700. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  701. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  702. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  703. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  704. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  705. { AST_EVENT_IE_EXPECTED_ADDR, SEC_EVT_FIELD(unexpected_addr, expected_addr) },
  706. { AST_EVENT_IE_END, 0 }
  707. },
  708. .optional_ies = {
  709. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  710. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  711. { AST_EVENT_IE_END, 0 }
  712. },
  713. },
  714. [AST_SECURITY_EVENT_CHAL_RESP_FAILED] = {
  715. .name = "ChallengeResponseFailed",
  716. .version = AST_SECURITY_EVENT_CHAL_RESP_FAILED_VERSION,
  717. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  718. .required_ies = {
  719. { AST_EVENT_IE_EVENT_TV, 0 },
  720. { AST_EVENT_IE_SEVERITY, 0 },
  721. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  722. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  723. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  724. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  725. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  726. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  727. { AST_EVENT_IE_CHALLENGE, SEC_EVT_FIELD(chal_resp_failed, challenge) },
  728. { AST_EVENT_IE_RESPONSE, SEC_EVT_FIELD(chal_resp_failed, response) },
  729. { AST_EVENT_IE_EXPECTED_RESPONSE, SEC_EVT_FIELD(chal_resp_failed, expected_response) },
  730. { AST_EVENT_IE_END, 0 }
  731. },
  732. .optional_ies = {
  733. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  734. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  735. { AST_EVENT_IE_END, 0 }
  736. },
  737. },
  738. [AST_SECURITY_EVENT_INVAL_PASSWORD] = {
  739. .name = "InvalidPassword",
  740. .version = AST_SECURITY_EVENT_INVAL_PASSWORD_VERSION,
  741. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  742. .required_ies = {
  743. { AST_EVENT_IE_EVENT_TV, 0 },
  744. { AST_EVENT_IE_SEVERITY, 0 },
  745. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  746. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  747. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  748. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  749. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  750. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  751. { AST_EVENT_IE_END, 0 }
  752. },
  753. .optional_ies = {
  754. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  755. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  756. { AST_EVENT_IE_CHALLENGE, SEC_EVT_FIELD(inval_password, challenge) },
  757. { AST_EVENT_IE_RECEIVED_CHALLENGE, SEC_EVT_FIELD(inval_password, received_challenge) },
  758. { AST_EVENT_IE_RECEIVED_HASH, SEC_EVT_FIELD(inval_password, received_hash) },
  759. { AST_EVENT_IE_END, 0 }
  760. },
  761. },
  762. [AST_SECURITY_EVENT_CHAL_SENT] = {
  763. .name = "ChallengeSent",
  764. .version = AST_SECURITY_EVENT_CHAL_SENT_VERSION,
  765. .severity = AST_SECURITY_EVENT_SEVERITY_INFO,
  766. .required_ies = {
  767. { AST_EVENT_IE_EVENT_TV, 0 },
  768. { AST_EVENT_IE_SEVERITY, 0 },
  769. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  770. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  771. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  772. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  773. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  774. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  775. { AST_EVENT_IE_CHALLENGE, SEC_EVT_FIELD(chal_sent, challenge) },
  776. { AST_EVENT_IE_END, 0 }
  777. },
  778. .optional_ies = {
  779. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  780. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  781. { AST_EVENT_IE_END, 0 }
  782. },
  783. },
  784. [AST_SECURITY_EVENT_INVAL_TRANSPORT] = {
  785. .name = "InvalidTransport",
  786. .version = AST_SECURITY_EVENT_INVAL_TRANSPORT_VERSION,
  787. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  788. .required_ies = {
  789. { AST_EVENT_IE_EVENT_TV, 0 },
  790. { AST_EVENT_IE_SEVERITY, 0 },
  791. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  792. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  793. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  794. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  795. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  796. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  797. { AST_EVENT_IE_ATTEMPTED_TRANSPORT, SEC_EVT_FIELD(inval_transport, transport) },
  798. { AST_EVENT_IE_END, 0 }
  799. },
  800. .optional_ies = {
  801. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  802. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  803. { AST_EVENT_IE_END, 0 }
  804. },
  805. },
  806. #undef SEC_EVT_FIELD
  807. };
  808. static const struct {
  809. enum ast_security_event_severity severity;
  810. const char *str;
  811. } severities[] = {
  812. { AST_SECURITY_EVENT_SEVERITY_INFO, "Informational" },
  813. { AST_SECURITY_EVENT_SEVERITY_ERROR, "Error" },
  814. };
  815. const char *ast_security_event_severity_get_name(
  816. const enum ast_security_event_severity severity)
  817. {
  818. unsigned int i;
  819. for (i = 0; i < ARRAY_LEN(severities); i++) {
  820. if (severities[i].severity == severity) {
  821. return severities[i].str;
  822. }
  823. }
  824. return NULL;
  825. }
  826. static int check_event_type(const enum ast_security_event_type event_type)
  827. {
  828. if ((unsigned int)event_type >= AST_SECURITY_EVENT_NUM_TYPES) {
  829. ast_log(LOG_ERROR, "Invalid security event type %u\n", event_type);
  830. return -1;
  831. }
  832. return 0;
  833. }
  834. const char *ast_security_event_get_name(const enum ast_security_event_type event_type)
  835. {
  836. if (check_event_type(event_type)) {
  837. return NULL;
  838. }
  839. return sec_events[event_type].name;
  840. }
  841. const struct ast_security_event_ie_type *ast_security_event_get_required_ies(
  842. const enum ast_security_event_type event_type)
  843. {
  844. if (check_event_type(event_type)) {
  845. return NULL;
  846. }
  847. return sec_events[event_type].required_ies;
  848. }
  849. const struct ast_security_event_ie_type *ast_security_event_get_optional_ies(
  850. const enum ast_security_event_type event_type)
  851. {
  852. if (check_event_type(event_type)) {
  853. return NULL;
  854. }
  855. return sec_events[event_type].optional_ies;
  856. }
  857. static int add_ip_json_object(struct ast_json *json, enum ast_event_ie_type ie_type,
  858. const struct ast_security_event_ip_addr *addr)
  859. {
  860. struct ast_json *json_ip;
  861. json_ip = ast_json_ipaddr(addr->addr, addr->transport);
  862. if (!json_ip) {
  863. return -1;
  864. }
  865. return ast_json_object_set(json, ast_event_get_ie_type_name(ie_type), json_ip);
  866. }
  867. enum ie_required {
  868. NOT_REQUIRED,
  869. REQUIRED
  870. };
  871. static int add_json_object(struct ast_json *json, const struct ast_security_event_common *sec,
  872. const struct ast_security_event_ie_type *ie_type, enum ie_required req)
  873. {
  874. int res = 0;
  875. switch (ie_type->ie_type) {
  876. case AST_EVENT_IE_SERVICE:
  877. case AST_EVENT_IE_ACCOUNT_ID:
  878. case AST_EVENT_IE_SESSION_ID:
  879. case AST_EVENT_IE_MODULE:
  880. case AST_EVENT_IE_ACL_NAME:
  881. case AST_EVENT_IE_REQUEST_TYPE:
  882. case AST_EVENT_IE_REQUEST_PARAMS:
  883. case AST_EVENT_IE_AUTH_METHOD:
  884. case AST_EVENT_IE_CHALLENGE:
  885. case AST_EVENT_IE_RESPONSE:
  886. case AST_EVENT_IE_EXPECTED_RESPONSE:
  887. case AST_EVENT_IE_RECEIVED_CHALLENGE:
  888. case AST_EVENT_IE_RECEIVED_HASH:
  889. case AST_EVENT_IE_ATTEMPTED_TRANSPORT:
  890. {
  891. const char *str;
  892. struct ast_json *json_string;
  893. str = *((const char **)(((const char *) sec) + ie_type->offset));
  894. if (req && !str) {
  895. ast_log(LOG_WARNING, "Required IE '%d' (%s) for security event "
  896. "type '%u' (%s) not present\n", ie_type->ie_type,
  897. ast_event_get_ie_type_name(ie_type->ie_type),
  898. sec->event_type, ast_security_event_get_name(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' (%s) for security event "
  935. "type '%u' (%s) not present\n", ie_type->ie_type,
  936. ast_event_get_ie_type_name(ie_type->ie_type),
  937. sec->event_type, ast_security_event_get_name(sec->event_type));
  938. res = -1;
  939. }
  940. if (addr->addr) {
  941. res = add_ip_json_object(json, ie_type->ie_type, addr);
  942. }
  943. break;
  944. }
  945. case AST_EVENT_IE_SESSION_TV:
  946. {
  947. const struct timeval *tval;
  948. tval = *((const struct timeval **)(((const char *) sec) + ie_type->offset));
  949. if (req && !tval) {
  950. ast_log(LOG_WARNING, "Required IE '%d' (%s) for security event "
  951. "type '%u' (%s) not present\n", ie_type->ie_type,
  952. ast_event_get_ie_type_name(ie_type->ie_type),
  953. sec->event_type, ast_security_event_get_name(sec->event_type));
  954. res = -1;
  955. }
  956. if (tval) {
  957. struct ast_json *json_tval = ast_json_timeval(*tval, NULL);
  958. if (!json_tval) {
  959. res = -1;
  960. break;
  961. }
  962. res = ast_json_object_set(json, ast_event_get_ie_type_name(ie_type->ie_type), json_tval);
  963. }
  964. break;
  965. }
  966. case AST_EVENT_IE_EVENT_TV:
  967. case AST_EVENT_IE_SEVERITY:
  968. /* Added automatically, nothing to do here. */
  969. break;
  970. default:
  971. ast_log(LOG_WARNING, "Unhandled IE type '%d' (%s), this security event "
  972. "will be missing data.\n", ie_type->ie_type,
  973. ast_event_get_ie_type_name(ie_type->ie_type));
  974. break;
  975. }
  976. return res;
  977. }
  978. static struct ast_json *alloc_security_event_json_object(const struct ast_security_event_common *sec)
  979. {
  980. struct timeval tv = ast_tvnow();
  981. const char *severity_str;
  982. struct ast_json *json_temp;
  983. RAII_VAR(struct ast_json *, json_object, ast_json_object_create(), ast_json_unref);
  984. if (!json_object) {
  985. return NULL;
  986. }
  987. /* NOTE: Every time ast_json_object_set is used, json_temp becomes a stale pointer since the reference is taken.
  988. * This is true even if ast_json_object_set fails.
  989. */
  990. json_temp = ast_json_integer_create(sec->event_type);
  991. if (!json_temp || ast_json_object_set(json_object, "SecurityEvent", json_temp)) {
  992. return NULL;
  993. }
  994. json_temp = ast_json_stringf("%u", sec->version);
  995. if (!json_temp || ast_json_object_set(json_object, ast_event_get_ie_type_name(AST_EVENT_IE_EVENT_VERSION), json_temp)) {
  996. return NULL;
  997. }
  998. /* AST_EVENT_IE_EVENT_TV */
  999. json_temp = ast_json_timeval(tv, NULL);
  1000. if (!json_temp || ast_json_object_set(json_object, ast_event_get_ie_type_name(AST_EVENT_IE_EVENT_TV), json_temp)) {
  1001. return NULL;
  1002. }
  1003. /* AST_EVENT_IE_SERVICE */
  1004. json_temp = ast_json_string_create(sec->service);
  1005. if (!json_temp || ast_json_object_set(json_object, ast_event_get_ie_type_name(AST_EVENT_IE_SERVICE), json_temp)) {
  1006. return NULL;
  1007. }
  1008. /* AST_EVENT_IE_SEVERITY */
  1009. severity_str = S_OR(
  1010. ast_security_event_severity_get_name(sec_events[sec->event_type].severity),
  1011. "Unknown"
  1012. );
  1013. json_temp = ast_json_string_create(severity_str);
  1014. if (!json_temp || ast_json_object_set(json_object, ast_event_get_ie_type_name(AST_EVENT_IE_SEVERITY), json_temp)) {
  1015. return NULL;
  1016. }
  1017. return ast_json_ref(json_object);
  1018. }
  1019. static int handle_security_event(const struct ast_security_event_common *sec)
  1020. {
  1021. RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
  1022. RAII_VAR(struct ast_json_payload *, json_payload, NULL, ao2_cleanup);
  1023. RAII_VAR(struct ast_json *, json_object, NULL, ast_json_unref);
  1024. const struct ast_security_event_ie_type *ies;
  1025. unsigned int i;
  1026. if (!ast_security_event_type()) {
  1027. return -1;
  1028. }
  1029. json_object = alloc_security_event_json_object(sec);
  1030. if (!json_object) {
  1031. return -1;
  1032. }
  1033. for (ies = ast_security_event_get_required_ies(sec->event_type), i = 0;
  1034. ies[i].ie_type != AST_EVENT_IE_END;
  1035. i++) {
  1036. if (add_json_object(json_object, sec, ies + i, REQUIRED)) {
  1037. goto return_error;
  1038. }
  1039. }
  1040. for (ies = ast_security_event_get_optional_ies(sec->event_type), i = 0;
  1041. ies[i].ie_type != AST_EVENT_IE_END;
  1042. i++) {
  1043. if (add_json_object(json_object, sec, ies + i, NOT_REQUIRED)) {
  1044. goto return_error;
  1045. }
  1046. }
  1047. /* The json blob is ready. Throw it in the payload and send it out over stasis. */
  1048. if (!(json_payload = ast_json_payload_create(json_object))) {
  1049. goto return_error;
  1050. }
  1051. msg = stasis_message_create(ast_security_event_type(), json_payload);
  1052. if (!msg) {
  1053. goto return_error;
  1054. }
  1055. stasis_publish(ast_security_topic(), msg);
  1056. return 0;
  1057. return_error:
  1058. return -1;
  1059. }
  1060. int ast_security_event_report(const struct ast_security_event_common *sec)
  1061. {
  1062. if ((unsigned int)sec->event_type >= AST_SECURITY_EVENT_NUM_TYPES) {
  1063. ast_log(LOG_ERROR, "Invalid security event type\n");
  1064. return -1;
  1065. }
  1066. if (!sec_events[sec->event_type].name) {
  1067. ast_log(LOG_WARNING, "Security event type %u not handled\n",
  1068. sec->event_type);
  1069. return -1;
  1070. }
  1071. if (sec->version != sec_events[sec->event_type].version) {
  1072. ast_log(LOG_WARNING, "Security event %u version mismatch\n",
  1073. sec->event_type);
  1074. return -1;
  1075. }
  1076. if (handle_security_event(sec)) {
  1077. ast_log(LOG_ERROR, "Failed to issue security event of type %s.\n",
  1078. ast_security_event_get_name(sec->event_type));
  1079. }
  1080. return 0;
  1081. }