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.
- data/History.txt +43 -0
- data/Manifest.txt +76 -23
- data/README.txt +31 -6
- data/Rakefile +2 -2
- data/lib/ronin/code/sql/{keyword.rb → add_column_clause.rb} +9 -13
- data/lib/ronin/code/sql/as.rb +47 -0
- data/lib/ronin/code/sql/asc.rb +38 -0
- data/lib/ronin/code/sql/between.rb +18 -12
- data/lib/ronin/code/sql/binary_expr.rb +12 -5
- data/lib/ronin/code/sql/clause.rb +37 -0
- data/lib/ronin/code/sql/code.rb +1 -1
- data/lib/ronin/code/sql/common_dialect.rb +16 -10
- data/lib/ronin/code/sql/create.rb +68 -0
- data/lib/ronin/code/sql/create_index.rb +9 -39
- data/lib/ronin/code/sql/create_table.rb +9 -56
- data/lib/ronin/code/sql/create_view.rb +7 -29
- data/lib/ronin/code/sql/default_values_clause.rb +38 -0
- data/lib/ronin/code/sql/delete.rb +10 -25
- data/lib/ronin/code/sql/desc.rb +38 -0
- data/lib/ronin/code/sql/dialect.rb +172 -52
- data/lib/ronin/code/sql/{builder.rb → drop.rb} +16 -20
- data/lib/ronin/code/sql/drop_index.rb +43 -0
- data/lib/ronin/code/sql/drop_table.rb +8 -16
- data/lib/ronin/code/sql/drop_view.rb +43 -0
- data/lib/ronin/code/sql/emittable.rb +102 -0
- data/lib/ronin/code/sql/exceptions/unknown_clause.rb +31 -0
- data/lib/ronin/code/sql/exceptions/unknown_dialect.rb +2 -2
- data/lib/ronin/code/sql/exceptions/unknown_statement.rb +31 -0
- data/lib/ronin/code/sql/exceptions.rb +3 -1
- data/lib/ronin/code/sql/expr.rb +7 -96
- data/lib/ronin/code/sql/field.rb +40 -23
- data/lib/ronin/code/sql/fields_clause.rb +48 -0
- data/lib/ronin/code/sql/from_clause.rb +44 -0
- data/lib/ronin/code/sql/function.rb +15 -12
- data/lib/ronin/code/sql/group_by_clause.rb +48 -0
- data/lib/ronin/code/sql/having_clause.rb +48 -0
- data/lib/ronin/code/sql/in.rb +9 -9
- data/lib/ronin/code/sql/injected_statement.rb +102 -0
- data/lib/ronin/code/sql/injection.rb +171 -5
- data/lib/ronin/code/sql/insert.rb +15 -45
- data/lib/ronin/code/sql/intersect_clause.rb +44 -0
- data/lib/ronin/code/sql/join_clause.rb +125 -0
- data/lib/ronin/code/sql/{like_expr.rb → like.rb} +19 -31
- data/lib/ronin/code/sql/limit_clause.rb +44 -0
- data/lib/ronin/code/sql/modifier.rb +50 -0
- data/lib/ronin/code/sql/offset_clause.rb +44 -0
- data/lib/ronin/code/sql/on_clause.rb +57 -0
- data/lib/ronin/code/sql/order_by_clause.rb +44 -0
- data/lib/ronin/code/sql/program.rb +170 -23
- data/lib/ronin/code/sql/rename_to_clause.rb +44 -0
- data/lib/ronin/code/sql/replace.rb +15 -17
- data/lib/ronin/code/sql/select.rb +46 -141
- data/lib/ronin/code/sql/set_clause.rb +44 -0
- data/lib/ronin/code/sql/statement.rb +117 -47
- data/lib/ronin/code/sql/token.rb +64 -0
- data/lib/ronin/code/sql/unary_expr.rb +9 -5
- data/lib/ronin/code/sql/union_all_clause.rb +44 -0
- data/lib/ronin/code/sql/union_clause.rb +44 -0
- data/lib/ronin/code/sql/update.rb +10 -31
- data/lib/ronin/code/sql/values_clause.rb +48 -0
- data/lib/ronin/code/sql/where_clause.rb +44 -0
- data/lib/ronin/code/sql.rb +1 -1
- data/lib/ronin/sql/error/error.rb +64 -0
- data/lib/ronin/sql/error/message.rb +64 -0
- data/lib/ronin/sql/error/pattern.rb +106 -0
- data/lib/ronin/sql/error/patterns.rb +100 -0
- data/lib/ronin/sql/error.rb +5 -30
- data/lib/ronin/sql/extensions/uri/http.rb +76 -21
- data/lib/ronin/sql/extensions/uri.rb +1 -1
- data/lib/ronin/sql/extensions.rb +2 -1
- data/lib/ronin/sql/injection.rb +213 -0
- data/lib/ronin/sql/version.rb +2 -2
- data/lib/ronin/sql.rb +7 -2
- data/spec/code/sql/create_examples.rb +19 -0
- data/spec/code/sql/create_index_spec.rb +25 -0
- data/spec/code/sql/create_table_spec.rb +27 -0
- data/spec/code/sql/create_view_spec.rb +16 -0
- data/spec/code/sql/delete_spec.rb +14 -0
- data/spec/code/sql/drop_examples.rb +10 -0
- data/spec/code/sql/drop_index_spec.rb +16 -0
- data/spec/code/sql/drop_table_spec.rb +16 -0
- data/spec/code/sql/drop_view_spec.rb +16 -0
- data/spec/code/sql/has_default_values_clause_examples.rb +10 -0
- data/spec/code/sql/has_fields_clause_examples.rb +15 -0
- data/spec/code/sql/has_from_clause_examples.rb +13 -0
- data/spec/code/sql/has_values_clause_examples.rb +15 -0
- data/spec/code/sql/has_where_clause_examples.rb +15 -0
- data/spec/code/sql/insert_spec.rb +21 -0
- data/spec/code/sql/replace_spec.rb +21 -0
- data/spec/code/sql/select_spec.rb +105 -0
- data/spec/code/sql/update_spec.rb +26 -0
- data/spec/helpers/code.rb +14 -0
- data/spec/sql/error_spec.rb +24 -0
- data/spec/sql/extensions/string_spec.rb +28 -0
- data/spec/sql_spec.rb +9 -0
- data/tasks/spec.rb +2 -0
- metadata +82 -29
- data/lib/ronin/code/sql/injection_builder.rb +0 -137
- data/lib/ronin/code/sql/injection_style.rb +0 -79
- data/lib/ronin/code/sql/style.rb +0 -170
- 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-
|
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/
|
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,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