ronin-sql 0.2.4 → 1.0.0

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.
Files changed (154) hide show
  1. data/.document +4 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +1 -0
  4. data/.yardopts +1 -0
  5. data/COPYING.txt +623 -288
  6. data/{History.txt → ChangeLog.md} +33 -35
  7. data/Gemfile +25 -0
  8. data/README.md +110 -0
  9. data/Rakefile +30 -20
  10. data/bin/ronin-sql +18 -5
  11. data/gemspec.yml +16 -0
  12. data/lib/ronin/formatting/extensions/sql.rb +4 -3
  13. data/lib/ronin/formatting/extensions/sql/string.rb +83 -10
  14. data/lib/ronin/formatting/sql.rb +4 -3
  15. data/lib/ronin/sql.rb +5 -12
  16. data/lib/ronin/{code/sql/create_index.rb → sql/binary_expr.rb} +25 -18
  17. data/lib/ronin/sql/clause.rb +72 -0
  18. data/lib/ronin/sql/clauses.rb +297 -0
  19. data/lib/ronin/sql/emittable.rb +84 -0
  20. data/lib/ronin/sql/emitter.rb +375 -0
  21. data/lib/ronin/sql/field.rb +106 -0
  22. data/lib/ronin/{code/sql/as.rb → sql/fields.rb} +36 -17
  23. data/lib/ronin/{code/sql/binary_expr.rb → sql/function.rb} +27 -27
  24. data/lib/ronin/sql/functions.rb +989 -0
  25. data/lib/ronin/sql/injection.rb +125 -157
  26. data/lib/ronin/{code/sql/default_values_clause.rb → sql/literal.rb} +13 -11
  27. data/lib/ronin/sql/literals.rb +72 -0
  28. data/lib/ronin/sql/operators.rb +332 -0
  29. data/lib/ronin/sql/sql.rb +86 -0
  30. data/lib/ronin/sql/statement.rb +70 -0
  31. data/lib/ronin/sql/statement_list.rb +110 -0
  32. data/lib/ronin/sql/statements.rb +115 -0
  33. data/lib/ronin/{code/sql/desc.rb → sql/unary_expr.rb} +11 -11
  34. data/lib/ronin/sql/version.rb +5 -4
  35. data/ronin-sql.gemspec +61 -0
  36. data/spec/formatting/sql/string_spec.rb +172 -0
  37. data/spec/spec_helper.rb +1 -4
  38. data/spec/sql/binary_expr.rb +5 -0
  39. data/spec/sql/binary_expr_examples.rb +25 -0
  40. data/spec/sql/clause_examples.rb +43 -0
  41. data/spec/sql/clause_spec.rb +31 -0
  42. data/spec/sql/clauses_spec.rb +43 -0
  43. data/spec/sql/emittable_spec.rb +41 -0
  44. data/spec/sql/emitter_spec.rb +472 -0
  45. data/spec/sql/field_spec.rb +103 -0
  46. data/spec/sql/fields_spec.rb +40 -0
  47. data/spec/sql/function_examples.rb +30 -0
  48. data/spec/sql/function_spec.rb +25 -0
  49. data/spec/sql/functions_spec.rb +110 -0
  50. data/spec/sql/injection_spec.rb +233 -0
  51. data/spec/sql/literal_spec.rb +5 -0
  52. data/spec/sql/literals_spec.rb +46 -0
  53. data/spec/sql/operators_spec.rb +44 -0
  54. data/spec/sql/sql_spec.rb +18 -0
  55. data/spec/sql/statement_examples.rb +39 -0
  56. data/spec/sql/statement_list_spec.rb +48 -0
  57. data/spec/sql/statement_sql.rb +38 -0
  58. data/spec/sql/statements_spec.rb +22 -0
  59. data/spec/sql/unary_expr.rb +5 -0
  60. data/spec/sql/unary_expr_examples.rb +20 -0
  61. metadata +116 -217
  62. data.tar.gz.sig +0 -0
  63. data/Manifest.txt +0 -108
  64. data/README.txt +0 -112
  65. data/lib/ronin/code/sql.rb +0 -22
  66. data/lib/ronin/code/sql/add_column_clause.rb +0 -42
  67. data/lib/ronin/code/sql/alter_table.rb +0 -52
  68. data/lib/ronin/code/sql/asc.rb +0 -36
  69. data/lib/ronin/code/sql/between.rb +0 -66
  70. data/lib/ronin/code/sql/clause.rb +0 -35
  71. data/lib/ronin/code/sql/code.rb +0 -35
  72. data/lib/ronin/code/sql/common_dialect.rb +0 -66
  73. data/lib/ronin/code/sql/create.rb +0 -74
  74. data/lib/ronin/code/sql/create_table.rb +0 -44
  75. data/lib/ronin/code/sql/create_view.rb +0 -41
  76. data/lib/ronin/code/sql/delete.rb +0 -52
  77. data/lib/ronin/code/sql/dialect.rb +0 -282
  78. data/lib/ronin/code/sql/drop.rb +0 -55
  79. data/lib/ronin/code/sql/drop_index.rb +0 -41
  80. data/lib/ronin/code/sql/drop_table.rb +0 -41
  81. data/lib/ronin/code/sql/drop_view.rb +0 -41
  82. data/lib/ronin/code/sql/emittable.rb +0 -100
  83. data/lib/ronin/code/sql/exceptions.rb +0 -24
  84. data/lib/ronin/code/sql/exceptions/unknown_clause.rb +0 -29
  85. data/lib/ronin/code/sql/exceptions/unknown_dialect.rb +0 -29
  86. data/lib/ronin/code/sql/exceptions/unknown_statement.rb +0 -29
  87. data/lib/ronin/code/sql/expr.rb +0 -102
  88. data/lib/ronin/code/sql/field.rb +0 -101
  89. data/lib/ronin/code/sql/fields_clause.rb +0 -46
  90. data/lib/ronin/code/sql/from_clause.rb +0 -42
  91. data/lib/ronin/code/sql/function.rb +0 -53
  92. data/lib/ronin/code/sql/group_by_clause.rb +0 -46
  93. data/lib/ronin/code/sql/having_clause.rb +0 -46
  94. data/lib/ronin/code/sql/in.rb +0 -47
  95. data/lib/ronin/code/sql/injected_statement.rb +0 -100
  96. data/lib/ronin/code/sql/injection.rb +0 -203
  97. data/lib/ronin/code/sql/insert.rb +0 -54
  98. data/lib/ronin/code/sql/intersect_clause.rb +0 -42
  99. data/lib/ronin/code/sql/join_clause.rb +0 -123
  100. data/lib/ronin/code/sql/like.rb +0 -73
  101. data/lib/ronin/code/sql/limit_clause.rb +0 -42
  102. data/lib/ronin/code/sql/modifier.rb +0 -48
  103. data/lib/ronin/code/sql/offset_clause.rb +0 -42
  104. data/lib/ronin/code/sql/on_clause.rb +0 -55
  105. data/lib/ronin/code/sql/order_by_clause.rb +0 -42
  106. data/lib/ronin/code/sql/program.rb +0 -225
  107. data/lib/ronin/code/sql/rename_to_clause.rb +0 -42
  108. data/lib/ronin/code/sql/replace.rb +0 -54
  109. data/lib/ronin/code/sql/select.rb +0 -103
  110. data/lib/ronin/code/sql/set_clause.rb +0 -42
  111. data/lib/ronin/code/sql/statement.rb +0 -180
  112. data/lib/ronin/code/sql/token.rb +0 -62
  113. data/lib/ronin/code/sql/unary_expr.rb +0 -47
  114. data/lib/ronin/code/sql/union_all_clause.rb +0 -42
  115. data/lib/ronin/code/sql/union_clause.rb +0 -42
  116. data/lib/ronin/code/sql/update.rb +0 -52
  117. data/lib/ronin/code/sql/values_clause.rb +0 -46
  118. data/lib/ronin/code/sql/where_clause.rb +0 -42
  119. data/lib/ronin/sql/error.rb +0 -26
  120. data/lib/ronin/sql/error/error.rb +0 -62
  121. data/lib/ronin/sql/error/extensions.rb +0 -22
  122. data/lib/ronin/sql/error/extensions/string.rb +0 -77
  123. data/lib/ronin/sql/error/message.rb +0 -62
  124. data/lib/ronin/sql/error/pattern.rb +0 -104
  125. data/lib/ronin/sql/error/patterns.rb +0 -99
  126. data/lib/ronin/sql/extensions.rb +0 -22
  127. data/lib/ronin/sql/extensions/uri.rb +0 -22
  128. data/lib/ronin/sql/extensions/uri/http.rb +0 -107
  129. data/spec/code/sql/common_dialect_spec.rb +0 -205
  130. data/spec/code/sql/create_examples.rb +0 -19
  131. data/spec/code/sql/create_index_spec.rb +0 -25
  132. data/spec/code/sql/create_table_spec.rb +0 -27
  133. data/spec/code/sql/create_view_spec.rb +0 -16
  134. data/spec/code/sql/delete_spec.rb +0 -14
  135. data/spec/code/sql/drop_examples.rb +0 -10
  136. data/spec/code/sql/drop_index_spec.rb +0 -16
  137. data/spec/code/sql/drop_table_spec.rb +0 -16
  138. data/spec/code/sql/drop_view_spec.rb +0 -16
  139. data/spec/code/sql/has_default_values_clause_examples.rb +0 -10
  140. data/spec/code/sql/has_fields_clause_examples.rb +0 -15
  141. data/spec/code/sql/has_from_clause_examples.rb +0 -13
  142. data/spec/code/sql/has_values_clause_examples.rb +0 -15
  143. data/spec/code/sql/has_where_clause_examples.rb +0 -15
  144. data/spec/code/sql/insert_spec.rb +0 -21
  145. data/spec/code/sql/replace_spec.rb +0 -21
  146. data/spec/code/sql/select_spec.rb +0 -105
  147. data/spec/code/sql/update_spec.rb +0 -26
  148. data/spec/helpers/code.rb +0 -14
  149. data/spec/sql/error_spec.rb +0 -24
  150. data/spec/sql/extensions/uri/http_spec.rb +0 -34
  151. data/spec/sql_spec.rb +0 -9
  152. data/tasks/spec.rb +0 -10
  153. data/tasks/yard.rb +0 -13
  154. metadata.gz.sig +0 -0
@@ -1,42 +0,0 @@
1
- #
2
- # Ronin SQL - A Ronin library providing support for SQL related security
3
- # tasks.
4
- #
5
- # Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This program is free software; you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation; either version 2 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with this program; if not, write to the Free Software
19
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
- #
21
-
22
- require 'ronin/code/sql/clause'
23
-
24
- module Ronin
25
- module Code
26
- module SQL
27
- class LimitClause < Clause
28
-
29
- attr_accessor :value
30
-
31
- def initialize(value)
32
- @value = value
33
- end
34
-
35
- def emit
36
- emit_token('LIMIT') + emit_value(@value)
37
- end
38
-
39
- end
40
- end
41
- end
42
- end
@@ -1,48 +0,0 @@
1
- #
2
- # Ronin SQL - A Ronin library providing support for SQL related security
3
- # tasks.
4
- #
5
- # Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This program is free software; you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation; either version 2 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with this program; if not, write to the Free Software
19
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
- #
21
-
22
- require 'ronin/code/sql/emittable'
23
-
24
- module Ronin
25
- module Code
26
- module SQL
27
- class Modifier
28
-
29
- include Emittable
30
-
31
- # Modifier name
32
- attr_reader :name
33
-
34
- # Expression
35
- attr_reader :expr
36
-
37
- def initialize(expr,name)
38
- @expr = expr
39
- @name = name
40
- end
41
-
42
- def emit
43
- emit_value(@expr) + emit_token(@name)
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1,42 +0,0 @@
1
- #
2
- # Ronin SQL - A Ronin library providing support for SQL related security
3
- # tasks.
4
- #
5
- # Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This program is free software; you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation; either version 2 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with this program; if not, write to the Free Software
19
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
- #
21
-
22
- require 'ronin/code/sql/clause'
23
-
24
- module Ronin
25
- module Code
26
- module SQL
27
- class OffsetClause < Clause
28
-
29
- attr_accessor :value
30
-
31
- def initialize(value)
32
- @value = value
33
- end
34
-
35
- def emit
36
- emit_token('OFFSET') + emit_value(@value)
37
- end
38
-
39
- end
40
- end
41
- end
42
- end
@@ -1,55 +0,0 @@
1
- #
2
- # Ronin SQL - A Ronin library providing support for SQL related security
3
- # tasks.
4
- #
5
- # Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This program is free software; you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation; either version 2 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with this program; if not, write to the Free Software
19
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
- #
21
-
22
- require 'ronin/code/sql/clause'
23
-
24
- module Ronin
25
- module Code
26
- module SQL
27
- class OnClause < Clause
28
-
29
- # Table for the ON clause
30
- attr_accessor :table
31
-
32
- # Fields for the ON clause
33
- attr_accessor :fields
34
-
35
- #
36
- # Creates a new OnClause object with the specified _table_ name
37
- # and the given _fields_.
38
- #
39
- def initialize(table,fields=[])
40
- @table = table
41
- @fields = fields
42
- end
43
-
44
- def emit
45
- tokens = emit_token('ON') + emit_value(@table)
46
-
47
- tokens += emit_row(@fields) unless @fields.empty?
48
-
49
- return tokens
50
- end
51
-
52
- end
53
- end
54
- end
55
- end
@@ -1,42 +0,0 @@
1
- #
2
- # Ronin SQL - A Ronin library providing support for SQL related security
3
- # tasks.
4
- #
5
- # Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This program is free software; you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation; either version 2 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with this program; if not, write to the Free Software
19
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
- #
21
-
22
- require 'ronin/code/sql/clause'
23
-
24
- module Ronin
25
- module Code
26
- module SQL
27
- class OrderByClause < Clause
28
-
29
- attr_accessor :fields
30
-
31
- def initialize(*fields)
32
- @fields = fields
33
- end
34
-
35
- def emit
36
- emit_token('ORDER BY') + emit_row(@fields)
37
- end
38
-
39
- end
40
- end
41
- end
42
- end
@@ -1,225 +0,0 @@
1
- #
2
- # Ronin SQL - A Ronin library providing support for SQL related security
3
- # tasks.
4
- #
5
- # Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This program is free software; you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation; either version 2 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with this program; if not, write to the Free Software
19
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
- #
21
-
22
- require 'ronin/code/sql/dialect'
23
- require 'ronin/code/sql/common_dialect'
24
-
25
- require 'chars/char_set'
26
-
27
- module Ronin
28
- module Code
29
- module SQL
30
- class Program
31
-
32
- # Name of the dialect
33
- attr_reader :dialect
34
-
35
- # Use single-line or multi-line style
36
- attr_accessor :multiline
37
-
38
- # Use lowercase style
39
- attr_accessor :lowercase
40
-
41
- # Compile with less parenthesis
42
- attr_accessor :less_parenthesis
43
-
44
- # Space string
45
- attr_accessor :space
46
-
47
- # New-line string
48
- attr_accessor :newline
49
-
50
- def initialize(options={},&block)
51
- options[:dialect] ||= :common
52
- options[:symbols] ||= {}
53
-
54
- if options.has_key?(:multiline)
55
- @multiline = options[:multiline]
56
- else
57
- @multiline = true
58
- end
59
-
60
- if options.has_key?(:lowercase)
61
- @lowercase = options[:lowercase]
62
- else
63
- @lowercase = false
64
- end
65
-
66
- if options.has_key?(:less_parens)
67
- @less_parens = options[:less_parens]
68
- else
69
- @less_parens = false
70
- end
71
-
72
- @space = Chars::CharSet.new(options[:space] || ' ')
73
- @newline = Chars::CharSet.new(options[:newline] || "\n")
74
-
75
- @dialect = Dialect.get(options[:dialect]).new(options[:symbols])
76
-
77
- instance_eval(&block) if block
78
- end
79
-
80
- def self.compile(options={},&block)
81
- self.new(options,&block).compile
82
- end
83
-
84
- def symbols
85
- @dialect.symbols
86
- end
87
-
88
- def select(*arguments,&block)
89
- @dialect.statement(:select,*arguments,&block)
90
- end
91
-
92
- def compile
93
- sql = []
94
- stmt = ['']
95
- prev = nil
96
-
97
- each_string do |current|
98
- if current == ';'
99
- sql << stmt
100
- stmt = ['']
101
- elsif current == '('
102
- next if @less_parens
103
-
104
- stmt << current
105
- elsif current == ')'
106
- next if @less_parens
107
-
108
- stmt.last << current
109
- elsif (current == ',' || prev == '(')
110
- stmt.last << current
111
- elsif prev == ','
112
- if @less_parens
113
- stmt.last << current
114
- else
115
- stmt << current
116
- end
117
- else
118
- stmt << current
119
- end
120
-
121
- prev = current
122
- end
123
-
124
- sql_string = ''
125
-
126
- sql.each_with_index do |stmt,stmt_index|
127
- stmt_string = ''
128
-
129
- stmt.each_with_index do |token,token_index|
130
- unless token.empty?
131
- sql_string << token
132
-
133
- unless token_index == (stmt.length - 1)
134
- sql_string << space_token
135
- end
136
- end
137
- end
138
-
139
- sql_string << stmt_string
140
-
141
- unless stmt_index == (sql.length - 1)
142
- if @multiline
143
- sql_string << newline_token
144
- else
145
- sql_string << ';'
146
- sql_string << space_token
147
- end
148
- end
149
- end
150
-
151
- return sql_string
152
- end
153
-
154
- alias to_s compile
155
-
156
- protected
157
-
158
- def space_token
159
- @space.random_char
160
- end
161
-
162
- def newline_token
163
- @newline.random_char
164
- end
165
-
166
- def format_string(data)
167
- "'" + data.to_s.sub("'","''") + "'"
168
- end
169
-
170
- def format_token(token)
171
- token = token.to_s
172
-
173
- if @lowercase
174
- token.downcase!
175
- else
176
- token.upcase!
177
- end
178
-
179
- return token
180
- end
181
-
182
- def format(token)
183
- if token.kind_of?(Token)
184
- return format_token(token)
185
- elsif token.kind_of?(String)
186
- return format_string(token)
187
- else
188
- return token.to_s
189
- end
190
- end
191
-
192
- def each_token(&block)
193
- @dialect.each_token do |token|
194
- block.call(token)
195
- end
196
-
197
- return self
198
- end
199
-
200
- def each_string(&block)
201
- each_token do |token|
202
- block.call(format(token))
203
- end
204
-
205
- return self
206
- end
207
-
208
- def method_missing(name,*arguments,&block)
209
- if @dialect.has_statement?(name)
210
- return @dialect.enqueue_statement(name,*arguments,&block)
211
- elsif @dialect.methods.include?(name.to_s)
212
- return @dialect.send(name,*arguments,&block)
213
- elsif (arguments.empty? && block.nil?)
214
- if @dialect.symbols.has_symbol?(name)
215
- return @dialect.symbols[name]
216
- end
217
- end
218
-
219
- raise(NoMethodError,name.id2name)
220
- end
221
-
222
- end
223
- end
224
- end
225
- end