ronin-sql 0.1.1 → 0.2.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 (101) hide show
  1. data/History.txt +43 -0
  2. data/Manifest.txt +76 -23
  3. data/README.txt +31 -6
  4. data/Rakefile +2 -2
  5. data/lib/ronin/code/sql/{keyword.rb → add_column_clause.rb} +9 -13
  6. data/lib/ronin/code/sql/as.rb +47 -0
  7. data/lib/ronin/code/sql/asc.rb +38 -0
  8. data/lib/ronin/code/sql/between.rb +18 -12
  9. data/lib/ronin/code/sql/binary_expr.rb +12 -5
  10. data/lib/ronin/code/sql/clause.rb +37 -0
  11. data/lib/ronin/code/sql/code.rb +1 -1
  12. data/lib/ronin/code/sql/common_dialect.rb +16 -10
  13. data/lib/ronin/code/sql/create.rb +68 -0
  14. data/lib/ronin/code/sql/create_index.rb +9 -39
  15. data/lib/ronin/code/sql/create_table.rb +9 -56
  16. data/lib/ronin/code/sql/create_view.rb +7 -29
  17. data/lib/ronin/code/sql/default_values_clause.rb +38 -0
  18. data/lib/ronin/code/sql/delete.rb +10 -25
  19. data/lib/ronin/code/sql/desc.rb +38 -0
  20. data/lib/ronin/code/sql/dialect.rb +172 -52
  21. data/lib/ronin/code/sql/{builder.rb → drop.rb} +16 -20
  22. data/lib/ronin/code/sql/drop_index.rb +43 -0
  23. data/lib/ronin/code/sql/drop_table.rb +8 -16
  24. data/lib/ronin/code/sql/drop_view.rb +43 -0
  25. data/lib/ronin/code/sql/emittable.rb +102 -0
  26. data/lib/ronin/code/sql/exceptions/unknown_clause.rb +31 -0
  27. data/lib/ronin/code/sql/exceptions/unknown_dialect.rb +2 -2
  28. data/lib/ronin/code/sql/exceptions/unknown_statement.rb +31 -0
  29. data/lib/ronin/code/sql/exceptions.rb +3 -1
  30. data/lib/ronin/code/sql/expr.rb +7 -96
  31. data/lib/ronin/code/sql/field.rb +40 -23
  32. data/lib/ronin/code/sql/fields_clause.rb +48 -0
  33. data/lib/ronin/code/sql/from_clause.rb +44 -0
  34. data/lib/ronin/code/sql/function.rb +15 -12
  35. data/lib/ronin/code/sql/group_by_clause.rb +48 -0
  36. data/lib/ronin/code/sql/having_clause.rb +48 -0
  37. data/lib/ronin/code/sql/in.rb +9 -9
  38. data/lib/ronin/code/sql/injected_statement.rb +102 -0
  39. data/lib/ronin/code/sql/injection.rb +171 -5
  40. data/lib/ronin/code/sql/insert.rb +15 -45
  41. data/lib/ronin/code/sql/intersect_clause.rb +44 -0
  42. data/lib/ronin/code/sql/join_clause.rb +125 -0
  43. data/lib/ronin/code/sql/{like_expr.rb → like.rb} +19 -31
  44. data/lib/ronin/code/sql/limit_clause.rb +44 -0
  45. data/lib/ronin/code/sql/modifier.rb +50 -0
  46. data/lib/ronin/code/sql/offset_clause.rb +44 -0
  47. data/lib/ronin/code/sql/on_clause.rb +57 -0
  48. data/lib/ronin/code/sql/order_by_clause.rb +44 -0
  49. data/lib/ronin/code/sql/program.rb +170 -23
  50. data/lib/ronin/code/sql/rename_to_clause.rb +44 -0
  51. data/lib/ronin/code/sql/replace.rb +15 -17
  52. data/lib/ronin/code/sql/select.rb +46 -141
  53. data/lib/ronin/code/sql/set_clause.rb +44 -0
  54. data/lib/ronin/code/sql/statement.rb +117 -47
  55. data/lib/ronin/code/sql/token.rb +64 -0
  56. data/lib/ronin/code/sql/unary_expr.rb +9 -5
  57. data/lib/ronin/code/sql/union_all_clause.rb +44 -0
  58. data/lib/ronin/code/sql/union_clause.rb +44 -0
  59. data/lib/ronin/code/sql/update.rb +10 -31
  60. data/lib/ronin/code/sql/values_clause.rb +48 -0
  61. data/lib/ronin/code/sql/where_clause.rb +44 -0
  62. data/lib/ronin/code/sql.rb +1 -1
  63. data/lib/ronin/sql/error/error.rb +64 -0
  64. data/lib/ronin/sql/error/message.rb +64 -0
  65. data/lib/ronin/sql/error/pattern.rb +106 -0
  66. data/lib/ronin/sql/error/patterns.rb +100 -0
  67. data/lib/ronin/sql/error.rb +5 -30
  68. data/lib/ronin/sql/extensions/uri/http.rb +76 -21
  69. data/lib/ronin/sql/extensions/uri.rb +1 -1
  70. data/lib/ronin/sql/extensions.rb +2 -1
  71. data/lib/ronin/sql/injection.rb +213 -0
  72. data/lib/ronin/sql/version.rb +2 -2
  73. data/lib/ronin/sql.rb +7 -2
  74. data/spec/code/sql/create_examples.rb +19 -0
  75. data/spec/code/sql/create_index_spec.rb +25 -0
  76. data/spec/code/sql/create_table_spec.rb +27 -0
  77. data/spec/code/sql/create_view_spec.rb +16 -0
  78. data/spec/code/sql/delete_spec.rb +14 -0
  79. data/spec/code/sql/drop_examples.rb +10 -0
  80. data/spec/code/sql/drop_index_spec.rb +16 -0
  81. data/spec/code/sql/drop_table_spec.rb +16 -0
  82. data/spec/code/sql/drop_view_spec.rb +16 -0
  83. data/spec/code/sql/has_default_values_clause_examples.rb +10 -0
  84. data/spec/code/sql/has_fields_clause_examples.rb +15 -0
  85. data/spec/code/sql/has_from_clause_examples.rb +13 -0
  86. data/spec/code/sql/has_values_clause_examples.rb +15 -0
  87. data/spec/code/sql/has_where_clause_examples.rb +15 -0
  88. data/spec/code/sql/insert_spec.rb +21 -0
  89. data/spec/code/sql/replace_spec.rb +21 -0
  90. data/spec/code/sql/select_spec.rb +105 -0
  91. data/spec/code/sql/update_spec.rb +26 -0
  92. data/spec/helpers/code.rb +14 -0
  93. data/spec/sql/error_spec.rb +24 -0
  94. data/spec/sql/extensions/string_spec.rb +28 -0
  95. data/spec/sql_spec.rb +9 -0
  96. data/tasks/spec.rb +2 -0
  97. metadata +82 -29
  98. data/lib/ronin/code/sql/injection_builder.rb +0 -137
  99. data/lib/ronin/code/sql/injection_style.rb +0 -79
  100. data/lib/ronin/code/sql/style.rb +0 -170
  101. data/lib/ronin/sql/sql.rb +0 -83
data/lib/ronin/sql.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  # Ronin SQL - A Ronin library providing support for SQL related security
4
4
  # tasks.
5
5
  #
6
- # Copyright (c) 2007-2008 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ # Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
7
7
  #
8
8
  # This program is free software; you can redistribute it and/or modify
9
9
  # it under the terms of the GNU General Public License as published by
@@ -24,5 +24,10 @@
24
24
  require 'ronin/code/sql'
25
25
  require 'ronin/sql/extensions'
26
26
  require 'ronin/sql/error'
27
- require 'ronin/sql/sql'
27
+ require 'ronin/sql/injection'
28
28
  require 'ronin/sql/version'
29
+ require 'ronin/config'
30
+
31
+ module Ronin
32
+ Config.load :sql
33
+ end
@@ -0,0 +1,19 @@
1
+ require 'ronin/code/sql/create'
2
+
3
+ require 'code/sql/has_fields_clause_examples'
4
+
5
+ require 'helpers/code'
6
+
7
+ shared_examples_for "Create" do
8
+ it_should_behave_like "has a fields clause"
9
+
10
+ it "should have a temp option" do
11
+ @sql.temp
12
+ @sql.instance_variable_get('@temp').should == true
13
+ end
14
+
15
+ it "should have a if_not_exists option" do
16
+ @sql.if_not_exists
17
+ @sql.instance_variable_get('@if_not_exists').should == true
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ require 'ronin/code/sql/create_index'
2
+
3
+ require 'code/sql/create_examples'
4
+
5
+ describe CreateIndex do
6
+ before(:each) do
7
+ @sql = CreateIndex.new(common_dialect)
8
+ end
9
+
10
+ it_should_behave_like "Create"
11
+
12
+ it "should have an on clause" do
13
+ @sql.on :users, [:name]
14
+
15
+ should_have_clause(@sql,:on) do |on|
16
+ on.table.should == :users
17
+ on.fields.should == [:name]
18
+ end
19
+ end
20
+
21
+ it "should have an index option" do
22
+ @sql.index :users
23
+ @sql.instance_variable_get('@name').should == :users
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ require 'ronin/code/sql/create_table'
2
+ require 'ronin/code/sql/program'
3
+
4
+ require 'code/sql/create_examples'
5
+
6
+ describe CreateTable do
7
+ before(:each) do
8
+ @sql = CreateTable.new(common_dialect)
9
+ end
10
+
11
+ it_should_behave_like "Create"
12
+
13
+ it "should have a columns clause" do
14
+ columns = [:id, :name, :users]
15
+
16
+ @sql.columns(*columns)
17
+
18
+ should_have_clause(@sql,:columns) do |clause|
19
+ clause.fields.should == columns
20
+ end
21
+ end
22
+
23
+ it "should have a table option" do
24
+ @sql.table :users
25
+ @sql.instance_variable_get('@name').should == :users
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ require 'ronin/code/sql/create_view'
2
+
3
+ require 'code/sql/create_examples'
4
+
5
+ describe CreateView do
6
+ before(:each) do
7
+ @sql = CreateView.new(common_dialect)
8
+ end
9
+
10
+ it_should_behave_like "Create"
11
+
12
+ it "should have a view option" do
13
+ @sql.view :users
14
+ @sql.instance_variable_get('@name').should == :users
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ require 'ronin/code/sql/delete'
2
+
3
+ require 'helpers/code'
4
+ require 'code/sql/has_from_clause_examples'
5
+ require 'code/sql/has_where_clause_examples'
6
+
7
+ describe Delete do
8
+ before(:each) do
9
+ @sql = Delete.new(common_dialect)
10
+ end
11
+
12
+ it_should_behave_like "has a from clause"
13
+ it_should_behave_like "has a where clause"
14
+ end
@@ -0,0 +1,10 @@
1
+ require 'ronin/code/sql/drop'
2
+
3
+ require 'helpers/code'
4
+
5
+ shared_examples_for "Drop" do
6
+ it "should have an if_exists option" do
7
+ @sql.if_exists
8
+ @sql.instance_variable_get('@if_exists').should == true
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ require 'ronin/code/sql/drop_index'
2
+
3
+ require 'code/sql/drop_examples'
4
+
5
+ describe DropIndex do
6
+ before(:each) do
7
+ @sql = DropIndex.new(common_dialect)
8
+ end
9
+
10
+ it_should_behave_like "Drop"
11
+
12
+ it "should have a table option" do
13
+ @sql.index :users
14
+ @sql.instance_variable_get('@name').should == :users
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require 'ronin/code/sql/drop_table'
2
+
3
+ require 'code/sql/drop_examples'
4
+
5
+ describe DropTable do
6
+ before(:each) do
7
+ @sql = DropTable.new(common_dialect)
8
+ end
9
+
10
+ it_should_behave_like "Drop"
11
+
12
+ it "should have a table option" do
13
+ @sql.table :users
14
+ @sql.instance_variable_get('@name').should == :users
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require 'ronin/code/sql/drop_view'
2
+
3
+ require 'code/sql/drop_examples'
4
+
5
+ describe DropView do
6
+ before(:each) do
7
+ @sql = DropView.new(common_dialect)
8
+ end
9
+
10
+ it_should_behave_like "Drop"
11
+
12
+ it "should have a table option" do
13
+ @sql.view :users
14
+ @sql.instance_variable_get('@name').should == :users
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ require 'ronin/code/sql/default_values_clause'
2
+
3
+ require 'helpers/code'
4
+
5
+ shared_examples_for "has a default values clause" do
6
+ it "should have a default values clause" do
7
+ @sql.default_values
8
+ @sql.has_clause?(:default_values).should == true
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ require 'ronin/code/sql/fields_clause'
2
+
3
+ require 'helpers/code'
4
+
5
+ shared_examples_for "has a fields clause" do
6
+ it "should have a fields clause" do
7
+ fields = [:id, :name, :users]
8
+
9
+ @sql.fields(*fields)
10
+
11
+ should_have_clause(@sql,:fields) do |clause|
12
+ clause.fields.should == fields
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ require 'ronin/code/sql/from_clause'
2
+
3
+ require 'helpers/code'
4
+
5
+ shared_examples_for "has a from clause" do
6
+ it "should have a from clause" do
7
+ @sql.from :users
8
+
9
+ should_have_clause(@sql,:from) do |from|
10
+ from.table.should == :users
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ require 'ronin/code/sql/values_clause'
2
+
3
+ require 'helpers/code'
4
+
5
+ shared_examples_for "has a values clause" do
6
+ it "should have a values clause" do
7
+ values = [1,'bob','secret']
8
+
9
+ @sql.values(*values)
10
+
11
+ should_have_clause(@sql,:values) do |clause|
12
+ clause.values.should == values
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'ronin/code/sql/where_clause'
2
+
3
+ require 'helpers/code'
4
+
5
+ shared_examples_for "has a where clause" do
6
+ it "should have a where clause" do
7
+ @sql.instance_eval do
8
+ where name == 'bob'
9
+ end
10
+
11
+ should_have_clause(@sql,:where) do |clause|
12
+ clause.expr.should_not be_nil
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ require 'ronin/code/sql/insert'
2
+
3
+ require 'helpers/code'
4
+ require 'code/sql/has_fields_clause_examples'
5
+ require 'code/sql/has_default_values_clause_examples'
6
+ require 'code/sql/has_values_clause_examples'
7
+
8
+ describe Insert do
9
+ before(:each) do
10
+ @sql = Insert.new(common_dialect)
11
+ end
12
+
13
+ it_should_behave_like "has a fields clause"
14
+ it_should_behave_like "has a default values clause"
15
+ it_should_behave_like "has a values clause"
16
+
17
+ it "should have a table option" do
18
+ @sql.table :users
19
+ @sql.instance_variable_get('@table').should == :users
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'ronin/code/sql/replace'
2
+
3
+ require 'helpers/code'
4
+ require 'code/sql/has_fields_clause_examples'
5
+ require 'code/sql/has_default_values_clause_examples'
6
+ require 'code/sql/has_values_clause_examples'
7
+
8
+ describe Replace do
9
+ before(:each) do
10
+ @sql = Replace.new(common_dialect)
11
+ end
12
+
13
+ it_should_behave_like 'has a fields clause'
14
+ it_should_behave_like 'has a default values clause'
15
+ it_should_behave_like 'has a values clause'
16
+
17
+ it "should have a table option" do
18
+ @sql.table :users
19
+ @sql.instance_variable_get('@table').should == :users
20
+ end
21
+ end
@@ -0,0 +1,105 @@
1
+ require 'ronin/code/sql/select'
2
+
3
+ require 'helpers/code'
4
+ require 'code/sql/has_from_clause_examples'
5
+ require 'code/sql/has_where_clause_examples'
6
+
7
+ describe Select do
8
+ before(:each) do
9
+ @sql = Select.new(common_dialect)
10
+ end
11
+
12
+ it_should_behave_like "has a fields clause"
13
+ it_should_behave_like "has a from clause"
14
+ it_should_behave_like "has a where clause"
15
+
16
+ it "should have a join clause" do
17
+ @sql.join :users, :inner => true, :left => true
18
+
19
+ should_have_clause(@sql,:join) do |join|
20
+ join.table.should == :users
21
+ join.side.should == :inner
22
+ join.direction.should == :left
23
+ end
24
+ end
25
+
26
+ it "should have a group by clause" do
27
+ fields = [:name, :age]
28
+
29
+ @sql.group_by(*fields)
30
+
31
+ should_have_clause(@sql,:group_by) do |group_by|
32
+ group_by.fields.should == fields
33
+ end
34
+ end
35
+
36
+ it "should have a having clause" do
37
+ @sql.instance_eval do
38
+ having name == 'bob'
39
+ end
40
+
41
+ should_have_clause(@sql,:having) do |clause|
42
+ clause.expr.should_not be_nil
43
+ end
44
+ end
45
+
46
+ it "should have a order by clause" do
47
+ fields = [:name, :age]
48
+
49
+ @sql.order_by(*fields)
50
+
51
+ should_have_clause(@sql,:order_by) do |clause|
52
+ clause.fields.should == fields
53
+ end
54
+ end
55
+
56
+ it "should have a limit clause" do
57
+ length = 10
58
+
59
+ @sql.limit length
60
+
61
+ should_have_clause(@sql,:limit) do |clause|
62
+ clause.value.should == length
63
+ end
64
+ end
65
+
66
+ it "should have a limit clause" do
67
+ index = 100
68
+
69
+ @sql.offset index
70
+
71
+ should_have_clause(@sql,:offset) do |clause|
72
+ clause.value.should == index
73
+ end
74
+ end
75
+
76
+ it "should have a union clause" do
77
+ query = 'SELECT * FROM admins'
78
+
79
+ @sql.union query
80
+
81
+ should_have_clause(@sql,:union) do |clause|
82
+ clause.select.should == query
83
+ end
84
+ end
85
+
86
+ it "should have a union all clause" do
87
+ query = 'SELECT * FROM admins'
88
+
89
+ @sql.union_all query
90
+
91
+ should_have_clause(@sql,:union_all) do |clause|
92
+ clause.select.should == query
93
+ end
94
+ end
95
+
96
+ it "should have an all rows option" do
97
+ @sql.all_rows
98
+ @sql.instance_variable_get('@all_rows').should == true
99
+ end
100
+
101
+ it "should have an distinct rows option" do
102
+ @sql.distinct_rows
103
+ @sql.instance_variable_get('@distinct_rows').should == true
104
+ end
105
+ end
@@ -0,0 +1,26 @@
1
+ require 'ronin/code/sql/update'
2
+
3
+ require 'helpers/code'
4
+ require 'code/sql/has_where_clause_examples'
5
+
6
+ describe Update do
7
+ before(:each) do
8
+ @sql = Update.new(common_dialect)
9
+ end
10
+
11
+ it_should_behave_like "has a where clause"
12
+
13
+ it "should have a set clause" do
14
+ values = [1, 'bob', 25]
15
+ @sql.set(*values)
16
+
17
+ should_have_clause(@sql,:set) do |clause|
18
+ clause.values.should == values
19
+ end
20
+ end
21
+
22
+ it "should have a table option" do
23
+ @sql.table :users
24
+ @sql.instance_variable_get('@table').should == :users
25
+ end
26
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ require 'ronin/code/sql/common_dialect'
4
+
5
+ include Code::SQL
6
+
7
+ def common_dialect
8
+ Dialect.get(:common).new
9
+ end
10
+
11
+ def should_have_clause(sql,name,&block)
12
+ sql.has_clause?(name).should == true
13
+ block.call(sql.get_clause(name)) if block
14
+ end
@@ -0,0 +1,24 @@
1
+ require 'ronin/sql/error'
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SQL::Error do
6
+ it "should provide error patterns" do
7
+ SQL::Error.patterns.should_not be_empty
8
+ end
9
+
10
+ it "should return patterns for specified database types" do
11
+ patterns = SQL::Error.patterns_for(:mysql, :php)
12
+
13
+ patterns[0].should == SQL::Error.patterns[:mysql]
14
+ patterns[1].should == SQL::Error.patterns[:php]
15
+ end
16
+
17
+ it "should return patterns for a specified SQL dialect" do
18
+ patterns = SQL::Error.patterns_for_dialect(:common)
19
+
20
+ patterns.each do |pattern|
21
+ pattern.dialect.should == :common
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ require 'ronin/sql/extensions/string'
2
+
3
+ require 'spec_helper'
4
+
5
+ describe String do
6
+ describe "SQL-hex encoding" do
7
+ it "should be able to be SQL-hex encoded" do
8
+ '/etc/passwd'.sql_encode.should == '0x2f6574632f706173737764'
9
+ end
10
+
11
+ it "should return an empty String if empty" do
12
+ ''.sql_encode.should == ''
13
+ end
14
+ end
15
+
16
+ describe "SQL-hex decoding" do
17
+ it "should be able to be SQL-hex decoded" do
18
+ encoded = '/etc/passwd'.sql_encode
19
+
20
+ encoded.should == '0x2f6574632f706173737764'
21
+ encoded.sql_decode.should == '/etc/passwd'
22
+ end
23
+
24
+ it "should be able to decode SQL comma-escaping" do
25
+ "'Conan O''Brian'".sql_decode.should == "Conan O'Brian"
26
+ end
27
+ end
28
+ end
data/spec/sql_spec.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'ronin/sql/version'
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SQL do
6
+ it "should have a version" do
7
+ SQL.const_defined?('VERSION').should == true
8
+ end
9
+ end
data/tasks/spec.rb CHANGED
@@ -5,3 +5,5 @@ Spec::Rake::SpecTask.new(:spec) do |t|
5
5
  t.libs += ['lib', 'spec']
6
6
  t.spec_opts = ['--colour', '--format', 'specdoc']
7
7
  end
8
+
9
+ task :default => :spec