expr_lib.go 8.7 KB

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