sneaql 0.0.12-java → 0.0.13-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 782dd6823d85946ec67bf1f3386df376fd73fe75
4
- data.tar.gz: 8579df76b676d3b3ad6a8cbc868940c9c98ae106
3
+ metadata.gz: 1691a3f7c5849f131d0c93b224dec808c78877d1
4
+ data.tar.gz: 6ecfdbd3c59590059ae603b85c6694ebab7174d0
5
5
  SHA512:
6
- metadata.gz: d690724dc1c9233b4ed2377bf54c4aa43f2a5aa9c2dd4cd23ae8b112d508aea340a8df0c486fec07b6fa53d2175e2b0160c0a7f37157f31721b931b9a13cba7b
7
- data.tar.gz: c8f1073dad3e852eb85e58758d5af6fe09093a9a9e2bd78334f1cd1764466c722e6ac3fffbbf4348911d0e84a19cece36c142005912081789c913a88e27162e6
6
+ metadata.gz: d38ec6c6d5ffcafd8090163e47e0ae3d77691ed8411a469fe1e653b24e7d88dbda0fb6b16bcf7ca373c27b0988801355960abecbccc2c7f528165acb50dac26a
7
+ data.tar.gz: 8c584cfeb4e4dfd5655aaf3bc6e19bb1da042281ef9c09dab2a0b0f593d8b28abddccbb95d91068795c718f67f950a717e575aba910e1dc02a91b17b03e0ea7b
data/bin/sneaql CHANGED
@@ -91,11 +91,27 @@ the above will execute the transform in the current directory. note that sneaql
91
91
 
92
92
  def exec(transform_path)
93
93
  begin
94
+ # default log level
94
95
  logger.level = Logger::INFO
95
- logger.level = Logger::DEBUG if options[:debug] == true
96
96
 
97
+ # bring in the env vars
97
98
  Dotenv.load(options[:env_file] ? options[:env_file] : 'sneaql.env')
98
99
 
100
+ # set log level if provided
101
+ if ENV['SNEAQL_LOG_LEVEL']
102
+ case ENV['SNEAQL_LOG_LEVEL'].downcase
103
+ when 'debug' then logger.level = Logger::DEBUG
104
+ when 'warn' then logger.level = Logger::WARN
105
+ when 'error' then logger.level = Logger::ERROR
106
+ when 'fatal' then logger.level = Logger::FATAL
107
+ else
108
+ raise "log level #{ENV['SNEAQL_LOG_LEVEL']} not supported"
109
+ end
110
+ end
111
+
112
+ # debug flag takes precedence
113
+ logger.level = Logger::DEBUG if options[:debug] == true
114
+
99
115
  base_path = File.expand_path(transform_path)
100
116
  raise 'base_path not provided' if base_path == nil
101
117
 
@@ -116,6 +132,7 @@ the above will execute the transform in the current directory. note that sneaql
116
132
 
117
133
  jdbc_driver_class = options[:jdbc_driver_class] ? options[:jdbc_driver_class] : ENV['SNEAQL_JDBC_DRIVER_CLASS']
118
134
  raise 'jdbc_driver_class not provided' if step_file == nil
135
+
119
136
  rescue => e
120
137
  puts e.message
121
138
  exit 1
@@ -175,7 +192,7 @@ the above will execute the transform in the current directory. note that sneaql
175
192
  method_option :debug , :default => false, :type => :boolean
176
193
 
177
194
  long_desc <<-LONGDESC
178
- executes the transform provided
195
+ validates the transform without actually running it
179
196
 
180
197
  PARAMETERS
181
198
 
@@ -196,11 +213,27 @@ the above will execute the transform in the current directory. note that sneaql
196
213
 
197
214
  def dryrun(transform_path)
198
215
  begin
216
+ # default log level
199
217
  logger.level = Logger::INFO
200
- logger.level = Logger::DEBUG if options[:debug] == true
201
218
 
219
+ # bring in the env vars
202
220
  Dotenv.load(options[:env_file] ? options[:env_file] : 'sneaql.env')
203
-
221
+
222
+ # set log level if provided
223
+ if ENV['SNEAQL_LOG_LEVEL']
224
+ case ENV['SNEAQL_LOG_LEVEL'].downcase
225
+ when 'debug' then logger.level = Logger::DEBUG
226
+ when 'warn' then logger.level = Logger::WARN
227
+ when 'error' then logger.level = Logger::ERROR
228
+ when 'fatal' then logger.level = Logger::FATAL
229
+ else
230
+ raise "log level #{ENV['SNEAQL_LOG_LEVEL']} not supported"
231
+ end
232
+ end
233
+
234
+ # debug flag takes precedence
235
+ logger.level = Logger::DEBUG if options[:debug] == true
236
+
204
237
  base_path = File.expand_path(transform_path)
205
238
  raise 'base_path not provided' if base_path == nil
206
239
 
@@ -112,7 +112,7 @@ module Sneaql
112
112
  valid << valid_recordset?(a)
113
113
  else valid << false end
114
114
  end
115
- @logger.debug(valid)
115
+ @logger.debug("arg validation results: #{valid}")
116
116
  !valid.include?(false)
117
117
  end
118
118
 
@@ -31,9 +31,9 @@ module Sneaql
31
31
  end
32
32
 
33
33
  def dockerfile()
34
- %{FROM sneaql:0.0.1
35
- RUN mkdir /tmp/repo
36
- #{@step_files.map {|s| "ADD #{s[:local_path]} /tmp/repo/#{s[:docker_path]}"}.join("\n")}
34
+ %{FROM full360/sneaql:latest
35
+ RUN mkdir /repo
36
+ #{@step_files.map {|s| "ADD #{s[:local_path]} /repo/#{s[:docker_path]}"}.join("\n")}
37
37
  }
38
38
  end
39
39
 
@@ -12,6 +12,8 @@ module Sneaql
12
12
  def initialize(logger = nil)
13
13
  @logger = logger ? logger : Logger.new(STDOUT)
14
14
  @environment_variables = filtered_environment_variables
15
+ validate_environment_variables unless ENV['SNEAQL_DISABLE_SQL_INJECTION_CHECK']
16
+ @environment_variables.freeze
15
17
  @session_variables = {}
16
18
  end
17
19
 
@@ -72,6 +74,12 @@ module Sneaql
72
74
  @logger.warn '{var_name} deprecated. use dynamic SQL syntax :var_name'
73
75
  return @session_variables[expression.gsub(/\{|\}/, '').strip]
74
76
 
77
+ # boolean
78
+ elsif ['true', 'false'].include?(expression.downcase)
79
+ @logger.debug "handling #{expression} as boolean"
80
+ return true if expression.downcase == 'true'
81
+ return false if expression.downcase == 'false'
82
+
75
83
  # string literal enclosed in single quotes
76
84
  # only works for a single word... no whitespace allowed at this time
77
85
  elsif expression =~ /\'.*\'/
@@ -147,7 +155,7 @@ module Sneaql
147
155
  # checks to see this is single quoted string, :variable_name, {var_name) or number (1, 1.031, etc.)
148
156
  # @param [String] expr value to check
149
157
  def valid_expression_reference?(expr)
150
- return expr.to_s.match(/(^\'.+\'$|^\:\w+$|^\{\w+\}$|^\d+$|^\d+\.\d*$)/) ? true : false
158
+ return expr.to_s.match(/(^\'.+\'$|^\:\w+$|^\{\w+\}$|^\d+$|^\d+\.\d*$|true|false)/i) ? true : false
151
159
  end
152
160
 
153
161
  # Operators valid for expression comparison
@@ -159,6 +167,7 @@ module Sneaql
159
167
  # provides a standardized method of comparing two expressions.
160
168
  # note that this only works for variables and constants.
161
169
  # current version supports float, integer, and contigious strings.
170
+ # as of 0.0.13 expressions need to be evaluated before being passed
162
171
  # @param [String] operator comparison operator @see valid_operators
163
172
  # @param [String] exp1 expression for left operand
164
173
  # @param [String] exp2 expression for right operand
@@ -171,10 +180,9 @@ module Sneaql
171
180
 
172
181
  # evaluate exps and coerce data types
173
182
  coerced = coerce_data_types(
174
- evaluate_expression(exp1),
175
- evaluate_expression(exp2)
183
+ exp1,
184
+ exp2
176
185
  )
177
-
178
186
  compare_values(operator, coerced[0], coerced[1])
179
187
  end
180
188
 
@@ -184,8 +192,14 @@ module Sneaql
184
192
  # @return [Array<Float, Fixnum, String>] returns array with both input expressions coerced to the same data type
185
193
  def coerce_data_types(exp1, exp2)
186
194
  # coerce data types to make for a good comparison
195
+ @logger.debug("coercing types #{[exp1.class, exp2.class]}")
187
196
  if exp1.class == exp2.class
188
197
  nil # nothing to do... continue with comparison
198
+ elsif ([exp1.class, exp2.class].include?(FalseClass)) or ([exp1.class, exp2.class].include?(TrueClass))
199
+ unless [coerce_boolean(exp1), coerce_boolean(exp2)].include?(nil)
200
+ exp1 = coerce_boolean(exp1)
201
+ exp2 = coerce_boolean(exp2)
202
+ end
189
203
  elsif [exp1.class, exp2.class].include? Float
190
204
  # if either is a float then make sure they are both floats
191
205
  exp1 = exp1.to_f
@@ -195,9 +209,32 @@ module Sneaql
195
209
  exp1 = exp1.to_i
196
210
  exp2 = exp2.to_i
197
211
  end
212
+ @logger.debug("coerced types #{[exp1.class, exp2.class]}")
198
213
  [exp1, exp2]
199
214
  end
200
215
 
216
+ # evaluates string or fixnum values to coerce into boolean
217
+ # @param [Object] value
218
+ # @return [Object]
219
+ def coerce_boolean(value)
220
+ retval = nil
221
+ if [TrueClass, FalseClass].include?(value.class)
222
+ retval = value
223
+ elsif value.class == Fixnum
224
+ retval = true if value == 1
225
+ retval = false if value == 0
226
+ elsif value.class == String
227
+ tmp = value.downcase.strip
228
+ case tmp
229
+ when 'f', 'false', '0'
230
+ retval = false
231
+ when 't', 'true', '1'
232
+ retval = true
233
+ end
234
+ end
235
+ return retval
236
+ end
237
+
201
238
  # performs the actual comparison between two values
202
239
  # @param [String] operator comparison operator @see valid_operators
203
240
  # @param [String] exp1 expression for left operand
@@ -233,8 +270,8 @@ module Sneaql
233
270
  def wildcard_to_regex(wildcard)
234
271
  Regexp.new("^#{wildcard}$".gsub('%','.*').gsub('_','.'))
235
272
  end
236
-
237
- # create a hash built from supplied environment variables.
273
+
274
+ # create a hash built from supplied environment variables.
238
275
  # if SNEAQL_AVAILABLE_ENV_VARS is provided (as a comma delimited list)
239
276
  # only the listed values are included.
240
277
  # return <Hash>
@@ -250,6 +287,24 @@ module Sneaql
250
287
  end
251
288
  return env_vars
252
289
  end
290
+
291
+ # basic regex filtering to help combat sql injection
292
+ # by way of environment variables
293
+ # @param [String] value value for validation
294
+ # @return [Boolean] returns true if value is safe
295
+ def sql_injection_filter(value)
296
+ return false if value.to_s.match(/(\'|\;|(drop|alter).*(table|user|view|column|database|schema|function|sequence|procedure))/i)
297
+ return true
298
+ end
299
+
300
+ # insures that all environment variables pass SQL injection test
301
+ def validate_environment_variables
302
+ @environment_variables.keys.each do |k|
303
+ unless sql_injection_filter(@environment_variables[k])
304
+ raise 'SQL Injection Filter Error'
305
+ end
306
+ end
307
+ end
253
308
  end
254
309
  end
255
310
  end
@@ -81,8 +81,8 @@ module Sneaql
81
81
  @logger.debug("applying #{exp} to #{record}")
82
82
  raw_result = @expression_manager.compare_expressions(
83
83
  exp[:operator],
84
- record[exp[:field]],
85
- exp[:expression]
84
+ @expression_manager.evaluate_expression(record[exp[:field]]),
85
+ @expression_manager.evaluate_expression(exp[:expression])
86
86
  )
87
87
  if exp[:condition] == 'include'
88
88
  conditions << raw_result
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sneaql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: java
6
6
  authors:
7
7
  - jeremy winters
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-04 00:00:00.000000000 Z
11
+ date: 2017-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement