libsqreen 0.6.1.0.1 → 1.0.4.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4ed91a585c820add7e0c12a77e14ffe98af314ba6ff63933cb44249d114bdc43
4
- data.tar.gz: 38b7a36192217771d45f9af2cfd05776c654c1174fe1877d1c17f3d528faeefe
3
+ metadata.gz: c2ae03953a7873a5385ccb306ba5ed318a3a26b4cea7e2bd2e07c7896a00e5f6
4
+ data.tar.gz: 7c041b5f6cb494c4a90146c547c922348714b8e41acfe9398f87d57ace23452f
5
5
  SHA512:
6
- metadata.gz: 7c7475304370b268725cc9de6b1b7de2281457c196bc302e7a5f7f5426ae69482b36eaf7068ec0e4f539e94f27067ddd57526199de1bf1bd54dfc676e121be47
7
- data.tar.gz: a3ef8f4146dd1f5f674d2b4f9df3ba3cdbb52ba8c9279886e789a6753bfaa708f5f9887fc0214965738a5f0eddf256ffacc24dcde82bc63480d9bc0599c3f1ba
6
+ metadata.gz: 76c210772b5a88b86a7e8d1e06e2bb0d50040d030fe612fa9bfca5de7b62feebec5d2d5d15c4f575761620a739024d0ed758fbfd95773802cc36ec1e1162ccbf
7
+ data.tar.gz: ee82a4de97c206df867fe626331376dfa9a982e49be60e310d93f94eff0c7c9c35482af5c9f7fdb1c1654c0db46622cb4f85ebddf528c37edf6c49d79a9c5641
@@ -26,8 +26,8 @@ static VALUE waf_args_cls;
26
26
  static const PWArgs pw_args_invalid = { .type = PWI_INVALID };
27
27
 
28
28
  static const PWConfig pw_config = {
29
- .maxArrayLength = UINT64_MAX,
30
- .maxMapDepth = UINT64_MAX,
29
+ .maxArrayLength = 256,
30
+ .maxMapDepth = 64,
31
31
  };
32
32
 
33
33
  static VALUE cvt_ruby_str_to_utf8(VALUE value);
@@ -47,7 +47,7 @@ libsqreen_waf_args_free(void *b) {
47
47
  return;
48
48
  }
49
49
 
50
- powerwaf_freeInput(&box->pw_args, false);
50
+ pw_freeArg(&box->pw_args);
51
51
  box->pw_args = pw_args_invalid;
52
52
  }
53
53
 
@@ -121,7 +121,7 @@ libsqreen_version(VALUE self) {
121
121
  PWVersion version;
122
122
  VALUE result;
123
123
 
124
- version = powerwaf_getVersion();
124
+ version = pw_getVersion();
125
125
  result = rb_ary_new();
126
126
  rb_ary_push(result, INT2NUM(version.major));
127
127
  rb_ary_push(result, INT2NUM(version.minor));
@@ -143,7 +143,7 @@ libsqreen_waf_set(VALUE self, VALUE name, VALUE rules) {
143
143
 
144
144
  pw_name = StringValueCStr(name);
145
145
  pw_rules = StringValueCStr(rules);
146
- pw_result = powerwaf_init(pw_name, pw_rules, &pw_config);
146
+ pw_result = pw_init(pw_name, pw_rules, &pw_config, NULL);
147
147
 
148
148
  result = pw_result ? Qtrue : Qfalse;
149
149
 
@@ -159,7 +159,7 @@ libsqreen_waf_delete(VALUE self, VALUE name) {
159
159
  Check_Type(name, T_STRING);
160
160
 
161
161
  pw_name = StringValueCStr(name);
162
- powerwaf_clearRule(pw_name);
162
+ pw_clearRule(pw_name);
163
163
 
164
164
  return Qnil;
165
165
  }
@@ -168,7 +168,7 @@ static VALUE
168
168
  libsqreen_waf_clear(VALUE self) {
169
169
  (void)self;
170
170
 
171
- powerwaf_clearAll();
171
+ pw_clearAll();
172
172
 
173
173
  return Qnil;
174
174
  }
@@ -188,7 +188,7 @@ value_to_pw_args(VALUE val) {
188
188
 
189
189
  pw_string = StringValuePtr(utf8_val);
190
190
  pw_len = (size_t)RSTRING_LEN(utf8_val);
191
- pw_val = powerwaf_createStringWithLength(pw_string, pw_len);
191
+ pw_val = pw_createStringWithLength(pw_string, pw_len);
192
192
  }
193
193
  break;
194
194
  case T_FIXNUM:
@@ -196,13 +196,13 @@ value_to_pw_args(VALUE val) {
196
196
  int64_t pw_int;
197
197
 
198
198
  pw_int = FIX2LONG(val);
199
- pw_val = powerwaf_createInt(pw_int);
199
+ pw_val = pw_createInt(pw_int);
200
200
  }
201
201
  break;
202
202
  case T_HASH:
203
203
  {
204
204
  VALUE waf_args = libsqreen_waf_args_new();
205
- libsqreen_waf_args_set_boxed(waf_args, powerwaf_createMap());
205
+ libsqreen_waf_args_set_boxed(waf_args, pw_createMap());
206
206
  // can in principle raise exception, but the WAF allocated
207
207
  // memory (included the partial list of allocated values
208
208
  // inserted in the map by on_hash_iteration) is already
@@ -216,7 +216,7 @@ value_to_pw_args(VALUE val) {
216
216
  case T_ARRAY:
217
217
  {
218
218
  VALUE waf_args = libsqreen_waf_args_new();
219
- libsqreen_waf_args_set_boxed(waf_args, powerwaf_createArray());
219
+ libsqreen_waf_args_set_boxed(waf_args, pw_createArray());
220
220
  PWArgs *array_p = libsqreen_waf_args_get_boxed(waf_args);
221
221
 
222
222
  for (int i = 0; i < RARRAY_LEN(val); i++) {
@@ -232,9 +232,9 @@ value_to_pw_args(VALUE val) {
232
232
 
233
233
  // can in principle raise
234
234
  pw_e = value_to_pw_args(e);
235
- ok = powerwaf_addToPWArgsArray(array_p, pw_e);
235
+ ok = pw_addArray(array_p, pw_e);
236
236
  if (!ok) {
237
- powerwaf_freeInput(&pw_e, false);
237
+ pw_freeArg(&pw_e);
238
238
  }
239
239
  }
240
240
 
@@ -249,7 +249,7 @@ value_to_pw_args(VALUE val) {
249
249
  * in the log if the values in the top map are missing. Replace all
250
250
  * invalid values with an empty map (this uses more maps than needed,
251
251
  but also doesn't hurt) */
252
- pw_val = powerwaf_createMap();
252
+ pw_val = pw_createMap();
253
253
  break;
254
254
  }
255
255
 
@@ -279,9 +279,9 @@ on_hash_iteration(volatile VALUE key, VALUE val, VALUE waf_value) {
279
279
  PWArgs value_to_add = value_to_pw_args(val);
280
280
  // key is volatile because between its last usage
281
281
  // and the usage of its component pw_key, GC may run
282
- ok = powerwaf_addToPWArgsMap(parent, pw_key, pw_len, value_to_add);
282
+ ok = pw_addMap(parent, pw_key, pw_len, value_to_add);
283
283
  if (!ok) {
284
- powerwaf_freeInput(&value_to_add, false);
284
+ pw_freeArg(&value_to_add);
285
285
  }
286
286
 
287
287
  return ST_CONTINUE;
@@ -433,7 +433,7 @@ libsqreen_waf_run(int argc, const VALUE *argv, VALUE self) {
433
433
 
434
434
  rb_scan_args(argc, argv, "31", &name, &args, &budget, &max_run_budget);
435
435
 
436
- PWRet *pw_ret;
436
+ PWRet pw_ret;
437
437
  VALUE result = rb_ary_new();
438
438
 
439
439
  Check_Type(name, T_STRING);
@@ -447,7 +447,7 @@ libsqreen_waf_run(int argc, const VALUE *argv, VALUE self) {
447
447
  struct timespec start = get_time_mono();
448
448
 
449
449
  VALUE waf_args = libsqreen_waf_args_new_from_hash(args);
450
- PWArgs *pw_args = libsqreen_waf_args_get_boxed(waf_args);
450
+ PWArgs pw_args = *libsqreen_waf_args_get_boxed(waf_args);
451
451
  const char *pw_name = StringValueCStr(name);
452
452
  size_t run_budget = calc_run_budget(start, gen_budget, max_run_budget);
453
453
  if (run_budget == 0) {
@@ -456,13 +456,13 @@ libsqreen_waf_run(int argc, const VALUE *argv, VALUE self) {
456
456
  return result;
457
457
  }
458
458
 
459
- pw_ret = powerwaf_run(pw_name, pw_args, run_budget);
459
+ pw_ret = pw_run(pw_name, pw_args, run_budget);
460
460
 
461
- rb_ary_push(result, ret_code_to_sym(pw_ret->action));
462
- rb_ary_push(result, pw_ret->data == NULL ? Qnil : rb_str_new2(pw_ret->data));
461
+ rb_ary_push(result, ret_code_to_sym(pw_ret.action));
462
+ rb_ary_push(result, pw_ret.data == NULL ? Qnil : rb_str_new2(pw_ret.data));
463
463
 
464
464
  libsqreen_waf_args_invalidate(waf_args);
465
- powerwaf_freeReturn(pw_ret);
465
+ pw_freeReturn(pw_ret);
466
466
 
467
467
  return result;
468
468
  }
@@ -38,7 +38,7 @@ log_init() {
38
38
 
39
39
  static void
40
40
  on_log(PW_LOG_LEVEL level, const char *function, const char *file,
41
- int line, const char *message, size_t message_len);
41
+ int line, const char *message, unsigned long long message_len);
42
42
 
43
43
 
44
44
  static VALUE log_level_to_fixnum(PW_LOG_LEVEL level) {
@@ -108,7 +108,7 @@ libsqreen_waf_log_enable(VALUE self, VALUE severity) {
108
108
  Check_Type(severity, T_SYMBOL);
109
109
 
110
110
  level = sym_to_log_level(severity);
111
- powerwaf_setupLogging(on_log, level);
111
+ pw_setupLogging(on_log, level);
112
112
  log_threshold = level;
113
113
 
114
114
  return Qnil;
@@ -119,7 +119,7 @@ libsqreen_waf_log_disable(VALUE self) {
119
119
  (void)self;
120
120
  PW_LOG_LEVEL level = PWL_ERROR;
121
121
 
122
- powerwaf_setupLogging(NULL, level);
122
+ pw_setupLogging(NULL, level);
123
123
  log_threshold = _PWL_AFTER_LAST;
124
124
 
125
125
  return Qnil;
@@ -159,7 +159,7 @@ on_log(PW_LOG_LEVEL level,
159
159
  const char *function,
160
160
  const char *file,
161
161
  int line,
162
- const char *message, size_t message_len) {
162
+ const char *message, unsigned long long message_len) {
163
163
  VALUE severity;
164
164
  VALUE logger;
165
165
  VALUE log_msg;
@@ -2,5 +2,5 @@
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
4
  module LibSqreen
5
- VERSION = "0.6.1.0.1"
5
+ VERSION = "1.0.4.0.0"
6
6
  end
@@ -1,235 +1,335 @@
1
1
  //
2
2
  // PowerWAF
3
- // Copyright © 2019 Sqreen. All rights reserved.
3
+ // Copyright © 2020 Sqreen. All rights reserved.
4
4
  //
5
5
 
6
- #ifndef PowerWAF_h
7
- #define PowerWAF_h
6
+ #ifndef pw_h
7
+ #define pw_h
8
8
 
9
9
  #ifdef __cplusplus
10
- extern "C" {
10
+ extern "C"
11
+ {
11
12
  #endif
12
13
 
13
- #include <stdint.h>
14
14
  #include <stdbool.h>
15
- #include <stdlib.h>
15
+ #include <stdint.h>
16
16
 
17
17
  #define PW_MAX_STRING_LENGTH 4096
18
18
  #define PW_MAX_MAP_DEPTH 20
19
19
  #define PW_MAX_ARRAY_LENGTH 256
20
20
  #define PW_RUN_TIMEOUT 5000
21
21
 
22
- typedef enum
23
- {
24
- PWI_INVALID = 0,
25
- PWI_SIGNED_NUMBER = 1 << 0, // `value` shall be decoded as a int64_t (or int32_t on 32bits platforms)
26
- PWI_UNSIGNED_NUMBER = 1 << 1, // `value` shall be decoded as a uint64_t (or uint32_t on 32bits platforms)
27
- PWI_STRING = 1 << 2, // `value` shall be decoded as a UTF-8 string of length `nbEntries`
28
- PWI_ARRAY = 1 << 3, // `value` shall be decoded as an array of PWArgs of length `nbEntries`, each item having no `parameterName`
29
- PWI_MAP = 1 << 4, // `value` shall be decoded as an array of PWArgs of length `nbEntries`, each item having a `parameterName`
30
- } PW_INPUT_TYPE;
31
-
32
- typedef struct _PWArgs PWArgs;
33
-
34
- struct _PWArgs
35
- {
36
- const char * parameterName;
37
- uint64_t parameterNameLength;
38
- union {
39
- const char * stringValue;
40
- uint64_t uintValue;
41
- int64_t intValue;
42
- const PWArgs * array;
43
- const void * rawHandle;
22
+ typedef enum
23
+ {
24
+ PWI_INVALID = 0,
25
+ PWI_SIGNED_NUMBER = 1 << 0, // `value` shall be decoded as a int64_t (or int32_t on 32bits platforms)
26
+ PWI_UNSIGNED_NUMBER = 1 << 1, // `value` shall be decoded as a uint64_t (or uint32_t on 32bits platforms)
27
+ PWI_STRING = 1 << 2, // `value` shall be decoded as a UTF-8 string of length `nbEntries`
28
+ PWI_ARRAY = 1 << 3, // `value` shall be decoded as an array of PWArgs of length `nbEntries`, each item having no `parameterName`
29
+ PWI_MAP = 1 << 4, // `value` shall be decoded as an array of PWArgs of length `nbEntries`, each item having a `parameterName`
30
+ } PW_INPUT_TYPE;
31
+
32
+ typedef void* PWHandle;
33
+ typedef void* PWAddContext;
34
+ typedef struct _PWArgs PWArgs;
35
+
36
+ struct _PWArgs
37
+ {
38
+ const char* parameterName;
39
+ uint64_t parameterNameLength;
40
+ union
41
+ {
42
+ const char* stringValue;
43
+ uint64_t uintValue;
44
+ int64_t intValue;
45
+ const PWArgs* array;
46
+ const void* rawHandle;
47
+ };
48
+ uint64_t nbEntries;
49
+ PW_INPUT_TYPE type;
44
50
  };
45
- uint64_t nbEntries;
46
- PW_INPUT_TYPE type;
47
- };
48
-
49
- typedef struct
50
- {
51
- uint64_t maxArrayLength;
52
- uint64_t maxMapDepth;
53
- } PWConfig;
54
51
 
55
- /// InitializePowerWAF
56
- ///
57
- /// Initialize a rule in the PowerWAF
58
- /// Must be called before calling RunPowerWAF on this rule name
59
- /// Will clear any existing rule with the same name
60
- ///
61
- /// @param ruleName Name the atom that provided the patterns we're about to initialize with
62
- /// @param wafRule JSON blob containing the patterns to work with
63
- /// @param config Customized limits for the PWArgs validation
64
- /// @return The success (true) or faillure (false) of the init
65
-
66
- extern bool powerwaf_init(const char * ruleName, const char * wafRule, const PWConfig * config);
67
-
68
-
69
- typedef enum
70
- {
71
- PWD_PARSING_JSON = 0,
72
- PWD_PARSING_RULE,
73
- PWD_PARSING_RULE_FILTER,
74
- PWD_OPERATOR_VALUE,
75
- PWD_DUPLICATE_RULE,
76
- PWD_PARSING_FLOW,
77
- PWD_PARSING_FLOW_STEP,
78
- PWD_MEANINGLESS_STEP,
79
- PWD_DUPLICATE_FLOW,
80
- PWD_DUPLICATE_FLOW_STEP,
81
- } PW_DIAG_CODE;
82
-
83
- /// powerwaf_initWithDiag
84
- ///
85
- /// Initialize a rule in the PowerWAF
86
- /// Must be called before calling RunPowerWAF on this rule name
87
- /// Will clear any existing rule with the same name
88
- /// If any error is encountered and an errors pointer is provided, it'll be populated with a report in JSON
89
- ///
90
- /// @param ruleName Name the atom that provided the patterns we're about to initialize with
91
- /// @param wafRule JSON blob containing the patterns to work with
92
- /// @param config Customized limits for the PWArgs validation. NULL or a value of 0 mean using the default value described above
93
- /// @param errors Pointer to the pointer to be populated with a potential error report. Set to NULL not to generate such a report
94
- /// @return The success (true) or faillure (false) of the init
95
-
96
-
97
- extern bool powerwaf_initWithDiag(const char * ruleName, const char * wafRule, const PWConfig * config, char ** errors);
98
-
99
- /// powerwaf_freeDiagnotics
100
- ///
101
- /// Free the error report generated by powerwaf_initWithDiag
102
- ///
103
- /// @param errors Pointer to a populated error report. NULL will be safely ignored
104
-
105
-
106
- extern void powerwaf_freeDiagnotics(char * errors);
107
-
108
- /// ClearRule
109
- ///
110
- /// Flush all context related to a rule
111
- ///
112
- /// @param ruleName Name of the rule to unload
113
-
114
- extern void powerwaf_clearRule(const char * ruleName);
115
-
116
- /// ClearAll
117
- ///
118
- /// Flush all context
119
-
120
- extern void powerwaf_clearAll(void);
121
-
122
-
123
- typedef enum
124
- {
125
- PW_ERR_INTERNAL = -6,
126
- PW_ERR_TIMEOUT = -5,
127
- PW_ERR_INVALID_CALL = -4,
128
- PW_ERR_INVALID_RULE = -3,
129
- PW_ERR_INVALID_FLOW = -2,
130
- PW_ERR_NORULE = -1,
131
- PW_GOOD = 0,
132
- PW_MONITOR = 1,
133
- PW_BLOCK = 2
134
- } PW_RET_CODE;
135
-
136
- typedef struct
137
- {
138
- PW_RET_CODE action;
139
- const char * data;
140
- } PWRet;
141
-
142
- /// RunPowerWAF
143
- ///
144
- /// Run the patterns from a rule on a set of parameters
145
- ///
146
- /// Threading guarantees: When calling this API, a lock will be taken for a very short window as this call will take ownership of a shared smart pointer.
147
- /// This pointer implement reference counting and can be owned by as many thread as you want.
148
- /// If you call powerwaf_init while evaluation of powerwaf_run is ongoing, the calls having already taken ownership will safely finish processing.
149
- /// The shared pointer will be destroyed, without locking powerwaf_init, when the last powerwaf_run finish processing.
150
- ///
151
- /// Maximum budget: The budget is internally stored in nanoseconds in an int64_t variable. This is then added to the current time, also coded in nano seconds.
152
- /// Due to those convertions, the maximum safe value for the next 15 years is 2^52. After that, 2^51.
153
- ///
154
- /// @param ruleName Name of the rule you want to run
155
- /// @param parameters The request's parameters
156
- /// @param timeLeftInUs The maximum time in microsecond PowerWAF is allowed to take
157
- /// @return Whether the pattern matched or whether we encountered an error
158
-
159
- extern PWRet * powerwaf_run(const char * ruleName, const PWArgs * parameters, size_t timeLeftInUs);
160
-
161
-
162
- typedef struct {
163
- uint16_t major;
164
- uint16_t minor;
165
- uint16_t patch;
166
- } PWVersion;
167
-
168
- /// GetVersion
169
- ///
170
- /// Return the API version of PowerWAF
171
- ///
172
- /// @return The API version in SemVer form
173
-
174
- extern PWVersion powerwaf_getVersion(void);
175
-
176
-
177
- typedef enum
178
- {
179
- PWL_TRACE,
180
- PWL_DEBUG,
181
- PWL_INFO,
182
- PWL_WARN,
183
- PWL_ERROR,
184
-
185
- _PWL_AFTER_LAST,
186
- } PW_LOG_LEVEL;
187
-
188
- ///
189
- /// Callback that powerwaf will call to relay messages to the binding.
190
- ///
191
- /// @param level The logging level
192
- /// @param function The native function that emitted the message. Never NULL
193
- /// @param file The file of the native function that emmitted the message. Never null
194
- /// @param line The line where the message was emmitted. Non-negative
195
- /// @param message The size of the logging message. NUL-terminated
196
- /// @param message_len The length of the logging message (excluding NUL terminator)
197
- ///
198
-
199
- typedef void (*powerwaf_logging_cb_t)(
200
- PW_LOG_LEVEL level, const char *function, const char *file, int line,
201
- const char *message, size_t message_len);
202
-
203
- ///
204
- /// Sets up PowerWAF to rely logging messages to the binding
205
- ///
206
- /// @param cb The callback to call, or NULL to stop relaying messages
207
- /// @param min_level The minimum logging level for which to relay messages (ignored if cb is NULL)
208
- /// @return whether the logging sink was successfully replaced
209
- ///
210
- bool powerwaf_setupLogging(powerwaf_logging_cb_t cb, PW_LOG_LEVEL min_level);
211
-
212
- /// PWArgs utils
213
-
214
- extern PWArgs powerwaf_getInvalidPWArgs(void);
215
- extern PWArgs powerwaf_createStringWithLength(const char * string, size_t length);
216
- extern PWArgs powerwaf_createString(const char * string);
217
- extern PWArgs powerwaf_createInt(int64_t value);
218
- extern PWArgs powerwaf_createUint(uint64_t value);
219
- extern PWArgs powerwaf_createArray(void);
220
- extern PWArgs powerwaf_createMap(void);
221
- extern bool powerwaf_addToPWArgsArray(PWArgs * array, PWArgs entry);
222
- // Setting entryNameLength to 0 will result in the entryName length being re-computed with strlen
223
- extern bool powerwaf_addToPWArgsMap(PWArgs * map, const char * entryName, size_t entryNameLength, PWArgs entry);
224
- extern void powerwaf_freeInput(PWArgs *input, bool freeSelf);
225
- extern void powerwaf_freeReturn(PWRet *output);
52
+ typedef enum
53
+ {
54
+ PWD_PARSING_JSON = 0,
55
+ PWD_PARSING_RULE,
56
+ PWD_PARSING_RULE_FILTER,
57
+ PWD_OPERATOR_VALUE,
58
+ PWD_DUPLICATE_RULE,
59
+ PWD_PARSING_FLOW,
60
+ PWD_PARSING_FLOW_STEP,
61
+ PWD_MEANINGLESS_STEP,
62
+ PWD_DUPLICATE_FLOW,
63
+ PWD_DUPLICATE_FLOW_STEP,
64
+ PWD_STEP_HAS_INVALID_RULE
65
+ } PW_DIAG_CODE;
66
+
67
+ typedef enum
68
+ {
69
+ PW_ERR_INTERNAL = -6,
70
+ PW_ERR_TIMEOUT = -5,
71
+ PW_ERR_INVALID_CALL = -4,
72
+ PW_ERR_INVALID_RULE = -3,
73
+ PW_ERR_INVALID_FLOW = -2,
74
+ PW_ERR_NORULE = -1,
75
+ PW_GOOD = 0,
76
+ PW_MONITOR = 1,
77
+ PW_BLOCK = 2
78
+ } PW_RET_CODE;
79
+
80
+ typedef enum
81
+ {
82
+ PWL_TRACE,
83
+ PWL_DEBUG,
84
+ PWL_INFO,
85
+ PWL_WARN,
86
+ PWL_ERROR,
87
+
88
+ _PWL_AFTER_LAST,
89
+ } PW_LOG_LEVEL;
90
+
91
+ /// pw_init
92
+ ///
93
+ /// Initialize a rule in the PowerWAF
94
+ /// Must be called before calling RunPowerWAF on this rule name
95
+ /// Will clear any existing rule with the same name
96
+ ///
97
+
98
+ typedef struct
99
+ {
100
+ uint64_t maxArrayLength;
101
+ uint64_t maxMapDepth;
102
+ } PWConfig;
103
+
104
+ ///
105
+ /// @param ruleName Name the atom that provided the patterns we're about to initialize with
106
+ /// @param wafRule JSON blob containing the patterns to work with
107
+ /// @param config Customized limits for the PWArgs validation
108
+ /// @param errors Pointer to the pointer to be populated with a potential error report. Set to NULL not to generate such a report
109
+ /// @return The success (true) or faillure (false) of the init
110
+
111
+ extern bool pw_init(const char* ruleName, const char* wafRule, const PWConfig* config, char** errors);
112
+
113
+ /// RunPowerWAF
114
+ ///
115
+ /// Run the patterns from a rule on a set of parameters
116
+ ///
117
+
118
+ typedef struct
119
+ {
120
+ PW_RET_CODE action;
121
+ const char* data;
122
+ const char* perfData;
123
+
124
+ uint32_t perfTotalRuntime;
125
+ uint32_t perfCacheHitRate;
126
+ } PWRet;
127
+
128
+ ///
129
+ /// Threading guarantees: When calling this API, a lock will be taken for a very short window as this call will take ownership of a shared smart pointer.
130
+ /// This pointer implement reference counting and can be owned by as many thread as you want.
131
+ /// If you call pw_init while evaluation of pw_run is ongoing, the calls having already taken ownership will safely finish processing.
132
+ /// The shared pointer will be destroyed, without locking pw_init, when the last pw_run finish processing.
133
+ ///
134
+ /// Maximum budget: The budget is internally stored in nanoseconds in an int64_t variable. This is then added to the current time, also coded in nano seconds.
135
+ /// Due to those convertions, the maximum safe value for the next 15 years is 2^52. After that, 2^51.
136
+ ///
137
+ /// @param ruleName Name of the rule you want to run
138
+ /// @param parameters The request's parameters
139
+ /// @param timeLeftInUs The maximum time in microsecond PowerWAF is allowed to take
140
+ /// @return Whether the pattern matched or whether we encountered an error
141
+
142
+ extern PWRet pw_run(const char* ruleName, const PWArgs parameters, uint64_t timeLeftInUs);
143
+
144
+ /// pw_clearRule
145
+ ///
146
+ /// Flush all context related to a rule
147
+ ///
148
+ /// @param ruleName Name of the rule to unload
149
+
150
+ extern void pw_clearRule(const char* ruleName);
151
+
152
+ /// ClearAll
153
+ ///
154
+ /// Flush all context
155
+
156
+ extern void pw_clearAll(void);
157
+
158
+ ///
159
+ /// The following APIs (handle API) give the caller the full responsibility of the lifecycle of the wafHandle
160
+ /// Freeing this handle while another run is in progress will cause crashes or worst.
161
+ /// Don't use this API unless you understand the consequence and can provide 100% guarantee around it.
162
+ /// In exchange for this risk, your handle isn't added to the registry and access won't involve our internal mutex
163
+ ///
164
+
165
+ /// pw_initH
166
+ ///
167
+ /// Initialize a rule in the PowerWAF, and return a handle
168
+ ///
169
+ /// @param wafRule JSON blob containing the patterns to work with
170
+ /// @param config Customized limits for the PWArgs validation
171
+ /// @param errors Pointer to the pointer to be populated with a potential error report. Set to NULL not to generate such a report
172
+ /// @return The handle of the initialized rule on success, NULL overwise
173
+
174
+ extern PWHandle pw_initH(const char* wafRule, const PWConfig* config, char** errors);
175
+
176
+ /// pw_runH
177
+ ///
178
+ /// Run the patterns from a handle on a set of parameters
179
+ ///
180
+ /// Threading guarantees: When calling this API, you're on your own.
181
+ /// Calling clearRuleH while a pw_runH is running will likely cause a use after free and a crash
182
+ /// Unless you _know_ what you're doing, use the safe API
183
+ ///
184
+ /// Maximum budget: The budget is internally stored in nanoseconds in an int64_t variable. This is then added to the current time, also coded in nano seconds.
185
+ /// Due to those convertions, the maximum safe value for the next 15 years is 2^52. After that, 2^51.
186
+ ///
187
+ /// @param wafHandle The rule handle
188
+ /// @param parameters The request's parameters
189
+ /// @param timeLeftInUs The maximum time in microsecond PowerWAF is allowed to take
190
+ /// @return Whether the pattern matched or whether we encountered an error
191
+
192
+ extern PWRet pw_runH(const PWHandle wafHandle, const PWArgs parameters, uint64_t timeLeftInUs);
193
+
194
+ /// pw_clearRuleH
195
+ ///
196
+ /// Destroy a WAF handle
197
+ ///
198
+ /// @param wafHandle handle to destroy
199
+
200
+ extern void pw_clearRuleH(PWHandle wafHandle);
201
+
202
+ ///
203
+ /// Additive API
204
+ ///
205
+ /// pw_initAdditive
206
+ ///
207
+ /// Create a additive context you can use with pw_runAdd
208
+ /// Similarly to the handle API, you must call pw_clearAdditive at the end of the request to free caches
209
+ /// You must make sure that the context isn't in use in pw_runAdditive when or after calling pw_clearAdditive
210
+ ///
211
+ /// @param ruleName Name of the rule you want to run (managed API)
212
+ /// @return A pointer to an additive context, or NULL if something went wrong
213
+
214
+ PWAddContext pw_initAdditive(const char* ruleName);
215
+
216
+ /// pw_initAdditiveH
217
+ ///
218
+ /// Similar to pw_initAdditive but for the handle API
219
+ ///
220
+ /// @param powerwafHandle The rule handle
221
+ /// @return A pointer to an additive context, or NULL if something went wrong
222
+
223
+ PWAddContext pw_initAdditiveH(const PWHandle powerwafHandle);
224
+
225
+ /// pw_runAdditive
226
+ ///
227
+ /// Run the rules affiliated with an additive context on some new parameters
228
+ ///
229
+ /// Important considerations:
230
+ /// You can call this API multiple time with the same context, and it will run on all new and past parameters
231
+ /// When sending PWArgs to this API, the additive context take ownership of the PWArgs and will take care of freeing it
232
+ /// When passing a parameter you already passed, further runs will ignore the past values
233
+ ///
234
+ /// @param context The additive context for this request
235
+ /// @param newArgs The newly available parameters
236
+ /// @param timeLeftInUs The maximum time in microsecond PowerWAF is allowed to take
237
+ /// @return Whether the pattern matched or whether we encountered an error
238
+
239
+ PWRet pw_runAdditive(PWAddContext context, PWArgs newArgs, uint64_t timeLeftInUs);
240
+
241
+ /// pw_clearAdditive
242
+ ///
243
+ /// Destroy the additive API context
244
+ /// Also take care of freeing any parameter sent to the context
245
+ ///
246
+ /// @param context The additive context to free
247
+
248
+ void pw_clearAdditive(PWAddContext context);
249
+
250
+ /// pw_freeDiagnotics
251
+ ///
252
+ /// Free the error report generated by pw_init
253
+ ///
254
+ /// @param errors Pointer to a populated error report. NULL will be safely ignored
255
+
256
+ extern void pw_freeDiagnotics(char* errors);
257
+
258
+ /// pw_freeReturn
259
+ ///
260
+ /// Free the buffers in the PWRet structure returned by pw_run
261
+ ///
262
+ /// @param output Structure provided by pw_run
263
+
264
+ extern void pw_freeReturn(PWRet output);
265
+
266
+ /// GetVersion
267
+ ///
268
+ /// Return the API version of PowerWAF
269
+ ///
270
+
271
+ typedef struct
272
+ {
273
+ uint16_t major;
274
+ uint16_t minor;
275
+ uint16_t patch;
276
+ } PWVersion;
277
+
278
+ ///
279
+ /// @return The API version in SemVer form
280
+
281
+ extern PWVersion pw_getVersion(void);
282
+
283
+ ///
284
+ /// Callback that powerwaf will call to relay messages to the binding.
285
+ ///
286
+ /// @param level The logging level
287
+ /// @param function The native function that emitted the message. Never NULL
288
+ /// @param file The file of the native function that emmitted the message. Never null
289
+ /// @param line The line where the message was emmitted. Non-negative
290
+ /// @param message The size of the logging message. NUL-terminated
291
+ /// @param message_len The length of the logging message (excluding NUL terminator)
292
+ ///
293
+
294
+ typedef void (*pw_logging_cb_t)(
295
+ PW_LOG_LEVEL level, const char* function, const char* file, int line,
296
+ const char* message, uint64_t message_len);
297
+
298
+ ///
299
+ /// Sets up PowerWAF to rely logging messages to the binding
300
+ ///
301
+ /// @param cb The callback to call, or NULL to stop relaying messages
302
+ /// @param min_level The minimum logging level for which to relay messages (ignored if cb is NULL)
303
+ /// @return whether the logging sink was successfully replaced
304
+ ///
305
+ bool pw_setupLogging(pw_logging_cb_t cb, PW_LOG_LEVEL min_level);
306
+
307
+ /// PWArgs utils
308
+
309
+ extern PWArgs pw_getInvalid(void);
310
+ extern PWArgs pw_createStringWithLength(const char* string, uint64_t length);
311
+ extern PWArgs pw_createString(const char* string);
312
+ extern PWArgs pw_createInt(int64_t value);
313
+ extern PWArgs pw_createUint(uint64_t value);
314
+ extern PWArgs pw_createArray(void);
315
+ extern PWArgs pw_createMap(void);
316
+ extern bool pw_addArray(PWArgs* array, PWArgs entry);
317
+ // Setting entryNameLength to 0 will result in the entryName length being re-computed with strlen
318
+ extern bool pw_addMap(PWArgs* map, const char* entryName, uint64_t entryNameLength, PWArgs entry);
319
+ extern void pw_freeArg(PWArgs* input);
320
+
321
+ /// Allocation utils to access PowerWAF's heap
322
+ /// If you're using the following two PWArgs util, make sure the memory is owned by libSqreen!
323
+ extern void* pw_memAlloc(uint64_t size);
324
+ extern void* pw_memRealloc(void* ptr, uint64_t size);
325
+ extern void pw_memFree(void* ptr);
326
+
327
+ /// Those APIs take ownership of your pointers: those may be free-ed at any time by libSqreen. Only use them with pointer allocated with pw_mem*
328
+ extern PWArgs pw_initString(const char* string, uint64_t length);
329
+ extern bool pw_addMapNoCopy(PWArgs* map, const char* entryName, uint64_t entryNameLength, PWArgs entry);
226
330
 
227
331
  #ifdef __cplusplus
228
332
  }
229
- #ifdef TESTING
230
- extern std::unordered_map<std::string, std::shared_ptr<PowerWAF>> & exportInternalRuleCollection();
231
- #endif
232
-
233
333
  #endif /* __cplusplus */
234
334
 
235
- #endif /* PowerWAF_h */
335
+ #endif /* pw_h */
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libsqreen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1.0.1
4
+ version: 1.0.4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sqreen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-26 00:00:00.000000000 Z
11
+ date: 2020-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -116,8 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  requirements: []
119
- rubyforge_project:
120
- rubygems_version: 2.7.7
119
+ rubygems_version: 3.1.4
121
120
  signing_key:
122
121
  specification_version: 4
123
122
  summary: Make the Sqreen agent faster