expr_lib.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. package exprhelpers
  2. import (
  3. "time"
  4. "github.com/crowdsecurity/crowdsec/pkg/cticlient"
  5. )
  6. type exprCustomFunc struct {
  7. name string
  8. function func(params ...any) (any, error)
  9. signature []interface{}
  10. }
  11. var exprFuncs = []exprCustomFunc{
  12. {
  13. name: "CrowdsecCTI",
  14. function: CrowdsecCTI,
  15. signature: []interface{}{
  16. new(func(string) (*cticlient.SmokeItem, error)),
  17. },
  18. },
  19. {
  20. name: "Distance",
  21. function: Distance,
  22. signature: []interface{}{
  23. new(func(string, string, string, string) (float64, error)),
  24. },
  25. },
  26. {
  27. name: "GetFromStash",
  28. function: GetFromStash,
  29. signature: []interface{}{
  30. new(func(string, string) (string, error)),
  31. },
  32. },
  33. {
  34. name: "Atof",
  35. function: Atof,
  36. signature: []interface{}{
  37. new(func(string) float64),
  38. },
  39. },
  40. {
  41. name: "JsonExtract",
  42. function: JsonExtract,
  43. signature: []interface{}{
  44. new(func(string, string) string),
  45. },
  46. },
  47. {
  48. name: "JsonExtractUnescape",
  49. function: JsonExtractUnescape,
  50. signature: []interface{}{
  51. new(func(string, ...string) string),
  52. },
  53. },
  54. {
  55. name: "JsonExtractLib",
  56. function: JsonExtractLib,
  57. signature: []interface{}{
  58. new(func(string, ...string) string),
  59. },
  60. },
  61. {
  62. name: "JsonExtractSlice",
  63. function: JsonExtractSlice,
  64. signature: []interface{}{
  65. new(func(string, string) []interface{}),
  66. },
  67. },
  68. {
  69. name: "JsonExtractObject",
  70. function: JsonExtractObject,
  71. signature: []interface{}{
  72. new(func(string, string) map[string]interface{}),
  73. },
  74. },
  75. {
  76. name: "ToJsonString",
  77. function: ToJson,
  78. signature: []interface{}{
  79. new(func(interface{}) string),
  80. },
  81. },
  82. {
  83. name: "File",
  84. function: File,
  85. signature: []interface{}{
  86. new(func(string) []string),
  87. },
  88. },
  89. {
  90. name: "RegexpInFile",
  91. function: RegexpInFile,
  92. signature: []interface{}{
  93. new(func(string, string) bool),
  94. },
  95. },
  96. {
  97. name: "Upper",
  98. function: Upper,
  99. signature: []interface{}{
  100. new(func(string) string),
  101. },
  102. },
  103. {
  104. name: "Lower",
  105. function: Lower,
  106. signature: []interface{}{
  107. new(func(string) string),
  108. },
  109. },
  110. {
  111. name: "IpInRange",
  112. function: IpInRange,
  113. signature: []interface{}{
  114. new(func(string, string) bool),
  115. },
  116. },
  117. {
  118. name: "TimeNow",
  119. function: TimeNow,
  120. signature: []interface{}{
  121. new(func() string),
  122. },
  123. },
  124. {
  125. name: "ParseUri",
  126. function: ParseUri,
  127. signature: []interface{}{
  128. new(func(string) map[string][]string),
  129. },
  130. },
  131. {
  132. name: "PathUnescape",
  133. function: PathUnescape,
  134. signature: []interface{}{
  135. new(func(string) string),
  136. },
  137. },
  138. {
  139. name: "QueryUnescape",
  140. function: QueryUnescape,
  141. signature: []interface{}{
  142. new(func(string) string),
  143. },
  144. },
  145. {
  146. name: "PathEscape",
  147. function: PathEscape,
  148. signature: []interface{}{
  149. new(func(string) string),
  150. },
  151. },
  152. {
  153. name: "QueryEscape",
  154. function: QueryEscape,
  155. signature: []interface{}{
  156. new(func(string) string),
  157. },
  158. },
  159. {
  160. name: "XMLGetAttributeValue",
  161. function: XMLGetAttributeValue,
  162. signature: []interface{}{
  163. new(func(string, string, string) string),
  164. },
  165. },
  166. {
  167. name: "XMLGetNodeValue",
  168. function: XMLGetNodeValue,
  169. signature: []interface{}{
  170. new(func(string, string) string),
  171. },
  172. },
  173. {
  174. name: "IpToRange",
  175. function: IpToRange,
  176. signature: []interface{}{
  177. new(func(string, string) string),
  178. },
  179. },
  180. {
  181. name: "IsIPV6",
  182. function: IsIPV6,
  183. signature: []interface{}{
  184. new(func(string) bool),
  185. },
  186. },
  187. {
  188. name: "IsIPV4",
  189. function: IsIPV4,
  190. signature: []interface{}{
  191. new(func(string) bool),
  192. },
  193. },
  194. {
  195. name: "IsIP",
  196. function: IsIP,
  197. signature: []interface{}{
  198. new(func(string) bool),
  199. },
  200. },
  201. {
  202. name: "LookupHost",
  203. function: LookupHost,
  204. signature: []interface{}{
  205. new(func(string) []string),
  206. },
  207. },
  208. {
  209. name: "GetDecisionsCount",
  210. function: GetDecisionsCount,
  211. signature: []interface{}{
  212. new(func(string) int),
  213. },
  214. },
  215. {
  216. name: "GetDecisionsSinceCount",
  217. function: GetDecisionsSinceCount,
  218. signature: []interface{}{
  219. new(func(string, string) int),
  220. },
  221. },
  222. {
  223. name: "Sprintf",
  224. function: Sprintf,
  225. signature: []interface{}{
  226. new(func(string, ...interface{}) string),
  227. },
  228. },
  229. {
  230. name: "ParseUnix",
  231. function: ParseUnix,
  232. signature: []interface{}{
  233. new(func(string) string),
  234. },
  235. },
  236. {
  237. name: "SetInStash", //FIXME: signature will probably blow everything up
  238. function: SetInStash,
  239. signature: []interface{}{
  240. new(func(string, string, string, *time.Duration) error),
  241. },
  242. },
  243. {
  244. name: "Fields",
  245. function: Fields,
  246. signature: []interface{}{
  247. new(func(string) []string),
  248. },
  249. },
  250. {
  251. name: "Index",
  252. function: Index,
  253. signature: []interface{}{
  254. new(func(string, string) int),
  255. },
  256. },
  257. {
  258. name: "IndexAny",
  259. function: IndexAny,
  260. signature: []interface{}{
  261. new(func(string, string) int),
  262. },
  263. },
  264. {
  265. name: "Join",
  266. function: Join,
  267. signature: []interface{}{
  268. new(func([]string, string) string),
  269. },
  270. },
  271. {
  272. name: "Split",
  273. function: Split,
  274. signature: []interface{}{
  275. new(func(string, string) []string),
  276. },
  277. },
  278. {
  279. name: "SplitAfter",
  280. function: SplitAfter,
  281. signature: []interface{}{
  282. new(func(string, string) []string),
  283. },
  284. },
  285. {
  286. name: "SplitAfterN",
  287. function: SplitAfterN,
  288. signature: []interface{}{
  289. new(func(string, string, int) []string),
  290. },
  291. },
  292. {
  293. name: "SplitN",
  294. function: SplitN,
  295. signature: []interface{}{
  296. new(func(string, string, int) []string),
  297. },
  298. },
  299. {
  300. name: "Replace",
  301. function: Replace,
  302. signature: []interface{}{
  303. new(func(string, string, string, int) string),
  304. },
  305. },
  306. {
  307. name: "ReplaceAll",
  308. function: ReplaceAll,
  309. signature: []interface{}{
  310. new(func(string, string, string) string),
  311. },
  312. },
  313. {
  314. name: "Trim",
  315. function: Trim,
  316. signature: []interface{}{
  317. new(func(string, string) string),
  318. },
  319. },
  320. {
  321. name: "TrimLeft",
  322. function: TrimLeft,
  323. signature: []interface{}{
  324. new(func(string, string) string),
  325. },
  326. },
  327. {
  328. name: "TrimRight",
  329. function: TrimRight,
  330. signature: []interface{}{
  331. new(func(string, string) string),
  332. },
  333. },
  334. {
  335. name: "TrimSpace",
  336. function: TrimSpace,
  337. signature: []interface{}{
  338. new(func(string) string),
  339. },
  340. },
  341. {
  342. name: "TrimPrefix",
  343. function: TrimPrefix,
  344. signature: []interface{}{
  345. new(func(string, string) string),
  346. },
  347. },
  348. {
  349. name: "TrimSuffix",
  350. function: TrimSuffix,
  351. signature: []interface{}{
  352. new(func(string, string) string),
  353. },
  354. },
  355. {
  356. name: "Get",
  357. function: Get,
  358. signature: []interface{}{
  359. new(func([]string, int) string),
  360. },
  361. },
  362. {
  363. name: "ToString",
  364. function: ToString,
  365. signature: []interface{}{
  366. new(func(interface{}) string),
  367. },
  368. },
  369. {
  370. name: "Match",
  371. function: Match,
  372. signature: []interface{}{
  373. new(func(string, string) bool),
  374. },
  375. },
  376. {
  377. name: "KeyExists",
  378. function: KeyExists,
  379. signature: []interface{}{
  380. new(func(string, map[string]any) bool),
  381. },
  382. },
  383. {
  384. name: "LogInfo",
  385. function: LogInfo,
  386. signature: []interface{}{
  387. new(func(string, ...interface{}) bool),
  388. },
  389. },
  390. {
  391. name: "B64Decode",
  392. function: B64Decode,
  393. signature: []interface{}{
  394. new(func(string) string),
  395. },
  396. },
  397. {
  398. name: "UnmarshalJSON",
  399. function: UnmarshalJSON,
  400. signature: []interface{}{
  401. new(func(string, map[string]interface{}, string) error),
  402. },
  403. },
  404. {
  405. name: "ParseKV",
  406. function: ParseKV,
  407. signature: []interface{}{
  408. new(func(string, map[string]interface{}, string) error),
  409. },
  410. },
  411. {
  412. name: "Hostname",
  413. function: Hostname,
  414. signature: []interface{}{
  415. new(func() (string, error)),
  416. },
  417. },
  418. {
  419. name: "FloatApproxEqual",
  420. function: FloatApproxEqual,
  421. signature: []interface{}{
  422. new(func(float64, float64) bool),
  423. },
  424. },
  425. }
  426. //go 1.20 "CutPrefix": strings.CutPrefix,
  427. //go 1.20 "CutSuffix": strings.CutSuffix,
  428. //"Cut": strings.Cut, -> returns more than 2 values, not supported by expr