expr_lib.go 7.9 KB

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