wwmd 0.2.20.3

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 (80) hide show
  1. data/History.txt +38 -0
  2. data/README.rdoc +87 -0
  3. data/Rakefile +33 -0
  4. data/examples/config_example.yaml +24 -0
  5. data/examples/wwmd_example.rb +73 -0
  6. data/lib/wwmd.rb +84 -0
  7. data/lib/wwmd/class_extensions.rb +4 -0
  8. data/lib/wwmd/class_extensions/extensions_base.rb +251 -0
  9. data/lib/wwmd/class_extensions/extensions_encoding.rb +79 -0
  10. data/lib/wwmd/class_extensions/extensions_external.rb +18 -0
  11. data/lib/wwmd/class_extensions/extensions_nilclass.rb +11 -0
  12. data/lib/wwmd/class_extensions/extensions_rbkb.rb +193 -0
  13. data/lib/wwmd/class_extensions/mixins_string_encoding.rb +40 -0
  14. data/lib/wwmd/guid.rb +155 -0
  15. data/lib/wwmd/page.rb +3 -0
  16. data/lib/wwmd/page/_fa.old +302 -0
  17. data/lib/wwmd/page/auth.rb +17 -0
  18. data/lib/wwmd/page/constants.rb +63 -0
  19. data/lib/wwmd/page/form.rb +99 -0
  20. data/lib/wwmd/page/form_array.rb +304 -0
  21. data/lib/wwmd/page/headers.rb +118 -0
  22. data/lib/wwmd/page/helpers.rb +41 -0
  23. data/lib/wwmd/page/html2text_hpricot.rb +76 -0
  24. data/lib/wwmd/page/html2text_nokogiri.rb +42 -0
  25. data/lib/wwmd/page/inputs.rb +47 -0
  26. data/lib/wwmd/page/irb_helpers.rb +114 -0
  27. data/lib/wwmd/page/page.rb +257 -0
  28. data/lib/wwmd/page/parsing_convenience.rb +98 -0
  29. data/lib/wwmd/page/reporting_helpers.rb +89 -0
  30. data/lib/wwmd/page/scrape.rb +196 -0
  31. data/lib/wwmd/page/spider.rb +127 -0
  32. data/lib/wwmd/urlparse.rb +125 -0
  33. data/lib/wwmd/viewstate.rb +17 -0
  34. data/lib/wwmd/viewstate/viewstate.rb +101 -0
  35. data/lib/wwmd/viewstate/viewstate_deserializer_methods.rb +217 -0
  36. data/lib/wwmd/viewstate/viewstate_from_xml.rb +129 -0
  37. data/lib/wwmd/viewstate/viewstate_types.rb +51 -0
  38. data/lib/wwmd/viewstate/viewstate_utils.rb +164 -0
  39. data/lib/wwmd/viewstate/viewstate_yaml.rb +25 -0
  40. data/lib/wwmd/viewstate/vs_stubs.rb +22 -0
  41. data/lib/wwmd/viewstate/vs_stubs/vs_array.rb +38 -0
  42. data/lib/wwmd/viewstate/vs_stubs/vs_binary_serialized.rb +30 -0
  43. data/lib/wwmd/viewstate/vs_stubs/vs_hashtable.rb +42 -0
  44. data/lib/wwmd/viewstate/vs_stubs/vs_hybrid_dict.rb +42 -0
  45. data/lib/wwmd/viewstate/vs_stubs/vs_indexed_string.rb +6 -0
  46. data/lib/wwmd/viewstate/vs_stubs/vs_indexed_string_ref.rb +24 -0
  47. data/lib/wwmd/viewstate/vs_stubs/vs_int_enum.rb +27 -0
  48. data/lib/wwmd/viewstate/vs_stubs/vs_list.rb +34 -0
  49. data/lib/wwmd/viewstate/vs_stubs/vs_pair.rb +29 -0
  50. data/lib/wwmd/viewstate/vs_stubs/vs_read_types.rb +11 -0
  51. data/lib/wwmd/viewstate/vs_stubs/vs_read_value.rb +35 -0
  52. data/lib/wwmd/viewstate/vs_stubs/vs_sparse_array.rb +58 -0
  53. data/lib/wwmd/viewstate/vs_stubs/vs_string.rb +33 -0
  54. data/lib/wwmd/viewstate/vs_stubs/vs_string_array.rb +39 -0
  55. data/lib/wwmd/viewstate/vs_stubs/vs_string_formatted.rb +32 -0
  56. data/lib/wwmd/viewstate/vs_stubs/vs_stub_helpers.rb +37 -0
  57. data/lib/wwmd/viewstate/vs_stubs/vs_triplet.rb +31 -0
  58. data/lib/wwmd/viewstate/vs_stubs/vs_type.rb +23 -0
  59. data/lib/wwmd/viewstate/vs_stubs/vs_unit.rb +30 -0
  60. data/lib/wwmd/viewstate/vs_stubs/vs_value.rb +35 -0
  61. data/lib/wwmd/wwmd_config.rb +52 -0
  62. data/lib/wwmd/wwmd_puts.rb +9 -0
  63. data/lib/wwmd/wwmd_utils.rb +28 -0
  64. data/spec/README +3 -0
  65. data/spec/form_array.spec +49 -0
  66. data/spec/spider_csrf_test.spec +28 -0
  67. data/spec/urlparse_test.spec +101 -0
  68. data/tasks/ann.rake +80 -0
  69. data/tasks/bones.rake +20 -0
  70. data/tasks/gem.rake +201 -0
  71. data/tasks/git.rake +40 -0
  72. data/tasks/notes.rake +27 -0
  73. data/tasks/post_load.rake +34 -0
  74. data/tasks/rdoc.rake +51 -0
  75. data/tasks/rubyforge.rake +55 -0
  76. data/tasks/setup.rb +292 -0
  77. data/tasks/spec.rake +54 -0
  78. data/tasks/test.rake +40 -0
  79. data/tasks/zentest.rake +36 -0
  80. metadata +222 -0
@@ -0,0 +1,125 @@
1
+ require 'htmlentities'
2
+ require 'wwmd/class_extensions'
3
+ module WWMD
4
+
5
+ # yay for experiments in re-inventing the wheel
6
+ class URLParse
7
+ HANDLERS = [:https,:http,:ftp,:file]
8
+ attr_reader :proto,:location,:path,:script,:rpath,:params,:base_url,:fqpath
9
+
10
+ def initialize(*args)
11
+ # nothing to see here, move along
12
+ end
13
+
14
+ def parse(*args)
15
+ if args.size == 1
16
+ base = ""
17
+ actual = args.shift.to_s.strip
18
+ else
19
+ base = args.shift.to_s.strip
20
+ actual = args.shift.to_s.strip
21
+ end
22
+ if actual.has_proto?
23
+ url = actual
24
+ else
25
+ url = base
26
+ url += "/" unless (base =~ /\/\z/ || actual =~ /\A\// || actual.empty?)
27
+ url += actual
28
+ end
29
+ return URI.parse(url).to_s
30
+
31
+ #### yeah... screw this
32
+ @proto = @location = @path = @script = @rpath = nil
33
+ @base = base.to_s
34
+ @actual = actual
35
+ if self.has_proto?
36
+ @base = @actual
37
+ @actual = ""
38
+ end
39
+ # does this work for http://location/? probably not
40
+ @base += "/" if (!@base.has_ext? || @base.split("/").size == 3)
41
+ @rpath = make_me_path.join("/")
42
+ @rpath += "?#{@params}" if @params
43
+ @path = "/" + @rpath
44
+ if @rpath.has_ext?
45
+ @path = "/" + @rpath.dirname
46
+ @script = @rpath.basename.clip
47
+ end
48
+ @script = "" if @script.nil?
49
+ begin
50
+ @base_url = @proto + "://" + @location
51
+ rescue => e
52
+ return false
53
+ raise e
54
+ dbg = WWMD.debug
55
+ WWMD.debug = true
56
+ putd "ERROR in urlparse TRACE:"
57
+ pp *args
58
+ putd @proto
59
+ putd @base
60
+ putd @actual
61
+ putd @location
62
+ WWMD.debug = dbg
63
+ raise e
64
+ end
65
+ @fqpath = @path + @script
66
+ self
67
+ end
68
+
69
+ def make_me_path
70
+ @proto,tpath = @base.split(":",2)
71
+ tpath ||= ""
72
+ @params = tpath.clop
73
+ tpath = tpath.clip
74
+ if @actual.empty?
75
+ a_path = tpath.split("/").reject { |x| x.empty? }
76
+ else
77
+ a_path = tpath.dirname.split("/").reject { |x| x.empty? }
78
+ end
79
+ @location = a_path.shift
80
+ if @actual.clop
81
+ @params = @actual.clop
82
+ @actual = @actual.clip
83
+ end
84
+ a_path = [] if (@actual =~ (/^\//))
85
+ b_path = @actual.split("/").reject { |x| x.empty? }
86
+ a_path.pop if (a_path[-1] =~ /^\?/).kind_of?(Fixnum) && !b_path.empty?
87
+ c_path = (a_path + @actual.split("/").reject { |x| x.empty? }).flatten
88
+ d_path = []
89
+ c_path.each do |x|
90
+ (d_path.pop;next) if x == ".."
91
+ next if (x == "." || x =~ /^\?/)
92
+ d_path << x
93
+ end
94
+ return d_path
95
+ end
96
+
97
+ def has_proto?
98
+ begin
99
+ return true if HANDLERS.include?(@actual.split(":").first.downcase.to_sym)
100
+ rescue
101
+ return false
102
+ end
103
+ end
104
+
105
+ def to_s
106
+ return "#{@proto}://#{@location}/#{rpath}"
107
+ end
108
+ end
109
+ end
110
+
111
+ class String
112
+ HANDLERS = [:https,:http,:ftp,:file]
113
+ def has_proto?
114
+ begin
115
+ return true if HANDLERS.include?(self.split(":").first.downcase.to_sym)
116
+ rescue
117
+ return false
118
+ end
119
+ end
120
+
121
+ def has_ext? #:nodoc:
122
+ return false if self.basename.split(".",2)[1].empty?
123
+ return true
124
+ end
125
+ end
@@ -0,0 +1,17 @@
1
+ require 'rubygems'
2
+ require 'nokogiri'
3
+ require 'rexml/document'
4
+ require 'htmlentities'
5
+ require 'wwmd/viewstate/viewstate_utils'
6
+ module WWMD
7
+ class ViewState
8
+ include ViewStateUtils
9
+ end
10
+ end
11
+ require 'wwmd/class_extensions'
12
+ require 'wwmd/viewstate/viewstate'
13
+ require 'wwmd/viewstate/viewstate_types'
14
+ require 'wwmd/viewstate/viewstate_yaml'
15
+ require 'wwmd/viewstate/viewstate_deserializer_methods'
16
+ require 'wwmd/viewstate/viewstate_from_xml'
17
+ require 'wwmd/viewstate/vs_stubs'
@@ -0,0 +1,101 @@
1
+ module WWMD
2
+ class ViewState
3
+ attr_accessor :b64
4
+ attr_accessor :obj_queue
5
+ attr_accessor :mac
6
+ attr_accessor :debug
7
+ attr_reader :raw
8
+ attr_reader :stack
9
+ attr_reader :buf
10
+ attr_reader :magic
11
+ attr_reader :size
12
+ attr_reader :indexed_strings
13
+ attr_reader :last_offset
14
+ attr_reader :xml
15
+ attr_reader :ndoc
16
+ attr_reader :obj_counts
17
+
18
+ def initialize(b64=nil)
19
+ @b64 = b64
20
+ @raw = ""
21
+ @stack = ""
22
+ @obj_queue = []
23
+ @size = 0
24
+ @indexed_strings = []
25
+ @mac = nil
26
+ @debug = false
27
+ @obj_counts = {}
28
+ self.deserialize if b64
29
+ end
30
+
31
+ # mac_enabled?
32
+ def mac_enabled?
33
+ return !@mac.nil?
34
+ end
35
+
36
+ # deserialize
37
+ def deserialize(b64=nil)
38
+ @obj_queue = []
39
+ @b64 = b64 if b64
40
+ @raw = @b64.b64d
41
+ @buf = StringIO.new(@raw)
42
+ @size = @buf.size
43
+ raise "Invalid ViewState" if not self.magic?
44
+ @obj_queue << self.deserialize_value
45
+ if (@buf.size - @buf.pos) == 20 then
46
+ @mac = @buf.read(20)
47
+ dlog(0x00,"MAC = #{@mac.hexify}")
48
+ end
49
+ raise "Error Parsing Viewstate (left: #{@buf.size - @buf.pos})" if not (@buf.size - @buf.pos) == 0
50
+ return !self.raw.nil?
51
+ end
52
+ alias_method :parse,:deserialize
53
+
54
+ def serialize(objs=nil,version=2)
55
+ @obj_queue = objs if objs
56
+ @stack << "\xFF\x01"
57
+ @stack << @obj_queue.first.serialize
58
+ @stack << @mac if @mac
59
+ return !self.stack.nil?
60
+ end
61
+
62
+ def to_xml
63
+ @xml = REXML::Document.new()
64
+ header = REXML::Element.new("ViewState")
65
+ header.add_attribute("version", @magic.b64e)
66
+ header.add_attribute("version_string", @magic.hexify)
67
+ header.add_element(@obj_queue.first.to_xml)
68
+ if self.mac_enabled?
69
+ max = REXML::Element.new("Mac")
70
+ max.add_attribute("encoding","hexify")
71
+ max.add_text(@mac.hexify)
72
+ header.add_element(max)
73
+ end
74
+ @xml.add_element(header)
75
+ @ndoc = Nokogiri::XML.parse(@xml.to_s)
76
+ self
77
+ end
78
+
79
+ # xpath search the nokogiri doc if we have one
80
+ def search(*args)
81
+ return "No XML" if !@ndoc
82
+ @ndoc.search(*args)
83
+ end
84
+
85
+ # move pp due to to_xml returning self
86
+ # this is all for the sake of getting #search to work
87
+ def pp(*args)
88
+ return "Undefined" if !@xml
89
+ @xml.pp(*args)
90
+ end
91
+
92
+ def from_yaml(yaml)
93
+ @obj_queue = YAML.load(yaml)
94
+ end
95
+
96
+ def to_yaml
97
+ @obj_queue.to_yaml
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,217 @@
1
+ module WWMD
2
+ class ViewState
3
+ # complex types
4
+ def pair(t=nil)
5
+ dlog t,"next = #{next_type}"
6
+ VSStubs::VSPair.new(self.deserialize_value,self.deserialize_value)
7
+ end
8
+
9
+ def triplet(t=nil)
10
+ dlog t,"next = #{next_type}"
11
+ VSStubs::VSTriplet.new(self.deserialize_value,self.deserialize_value,self.deserialize_value)
12
+ end
13
+
14
+ def type(t=nil)
15
+ typeref,typeval = self.deserialize_type
16
+ dlog(t,"typeref = 0x#{typeref.to_s(16)} typeval = #{typeval}")
17
+ VSStubs::VSType.new(typeref,typeval)
18
+ end
19
+
20
+ def string_formatted(t=nil)
21
+ typeref,typeval = self.deserialize_type
22
+ str = self.read_string
23
+ dlog(t,"typeref = 0x#{typeref.to_s(16)} typeval = #{typeval} string = #{str}")
24
+ VSStubs::VSStringFormatted.new(typeref,typeval,str)
25
+ end
26
+
27
+ def int_enum(t=nil)
28
+ typeref,typeval = self.deserialize_type
29
+ index = self.read_7bit_encoded_int
30
+ dlog(t,"typeref = 0x#{typeref.to_s(16)} typeval = #{typeval} index = #{index}")
31
+ VSStubs::VSIntEnum.new(typeref,typeval,index)
32
+ end
33
+
34
+ def binary_serialized(t=nil)
35
+ count = self.read_7bit_encoded_int
36
+ dlog(t,count)
37
+ bin = self.read(count)
38
+ me = VSStubs::VSBinarySerialized.new()
39
+ me.set(bin)
40
+ return me
41
+ end
42
+
43
+ def sparse_array(t=nil)
44
+ typeref,typeval = self.deserialize_type
45
+ size = read_7bit_encoded_int
46
+ elems = read_7bit_encoded_int
47
+ dlog(t,"typeref = 0x#{typeref.to_s(16)} typeval = #{typeval} size = #{size} elems = #{elems}")
48
+ me = VSStubs::VSSparseArray.new(typeref,typeval,size,elems)
49
+ if elems > size
50
+ raise "Invalid sparse_array"
51
+ end
52
+ (1..elems).each do |i|
53
+ idx = read_7bit_encoded_int
54
+ me.add(idx,self.deserialize_value)
55
+ end
56
+ return me
57
+ end
58
+
59
+ def hashtable(t=nil)
60
+ len = read_7bit_encoded_int
61
+ dlog(t,"len = #{len}")
62
+ me = VSStubs::VSHashtable.new()
63
+ (1..len).each do |i|
64
+ me.add(self.deserialize_value,self.deserialize_value)
65
+ end
66
+ return me
67
+ end
68
+
69
+ def hybrid_dict(t=nil)
70
+ len = read_7bit_encoded_int
71
+ dlog(t,"len = #{len}")
72
+ me = VSStubs::VSHybridDict.new()
73
+ (1..len).each do |i|
74
+ me.add(self.deserialize_value,self.deserialize_value)
75
+ end
76
+ return me
77
+ end
78
+
79
+ def array(t=nil)
80
+ typeref,typeval = self.deserialize_type
81
+ len = read_7bit_encoded_int
82
+ dlog(t,"typeref = 0x#{typeref.to_s(16)} typeval = #{typeval} len = #{len}")
83
+ me = VSStubs::VSArray.new(typeref,typeval)
84
+ (1..len).each do |i|
85
+ me.add(self.deserialize_value)
86
+ end
87
+ return me
88
+ end
89
+
90
+ def string_array(t=nil)
91
+ len = read_7bit_encoded_int
92
+ dlog(t,"len = #{len}")
93
+ me = VSStubs::VSStringArray.new()
94
+ (1..len).each do |i|
95
+ str = self.read_string
96
+ me.add(str)
97
+ dlog(t,"string_array_elem: #{str}")
98
+ end
99
+ return me
100
+ end
101
+
102
+ def list(t=nil)
103
+ len = read_7bit_encoded_int
104
+ dlog(t,"len = #{len}")
105
+ me = VSStubs::VSList.new()
106
+ (1..len).each do |i|
107
+ me.add(self.deserialize_value)
108
+ end
109
+ return me
110
+ end
111
+
112
+ def unit(t=nil)
113
+ s1 = read_double
114
+ s2 = read_int32
115
+ dlog(t,"#{s1.to_s(16).rjust(16,"0")},#{s2.to_s(16).rjust(8,"0")}")
116
+ VSStubs::VSUnit.new(s1,s2)
117
+ end
118
+
119
+ def indexed_string(t=nil)
120
+ str = self.read_string
121
+ @indexed_strings << str
122
+ dlog(t,"idx = #{@indexed_strings.size - 1} val = #{str}")
123
+ VSStubs::VSIndexedString.new(str)
124
+ end
125
+
126
+ def indexed_string_ref(t=nil)
127
+ ref = self.read_int
128
+ dlog(t,"ref = #{ref} val = #{@indexed_strings[ref]}")
129
+ VSStubs::VSIndexedStringRef.new(ref)
130
+ end
131
+
132
+ def string(t=nil)
133
+ str = self.read_string
134
+ dlog(t,str)
135
+ VSStubs::VSString.new(str)
136
+ end
137
+
138
+ # VSStubs::VSReadValue types
139
+ def color(t=nil)
140
+ val = self.read_int32
141
+ dlog(t,val.to_s(16))
142
+ VSStubs::VSColor.new(val)
143
+ end
144
+
145
+ def known_color(t=nil)
146
+ index = self.read_7bit_encoded_int
147
+ dlog(t,"index = #{index.to_s(16)}")
148
+ VSStubs::VSKnownColor.new(index)
149
+ end
150
+
151
+ def int16(t=nil)
152
+ val = read_short
153
+ dlog(t,val)
154
+ VSStubs::VSInt16.new(val)
155
+ end
156
+
157
+ def int32(t=nil)
158
+ val = self.read_7bit_encoded_int
159
+ dlog(t,val)
160
+ VSStubs::VSInt32.new(val)
161
+ end
162
+
163
+ def byte(t=nil)
164
+ val = self.read_byte
165
+ dlog(t,val)
166
+ VSStubs::VSByte.new(val)
167
+ end
168
+
169
+ def char(t=nil)
170
+ val = self.read_byte
171
+ dlog(t,val)
172
+ VSStubs::VSChar.new(val)
173
+ end
174
+
175
+ def date_time(t=nil)
176
+ val = self.read_double
177
+ dlog(t,val)
178
+ VSStubs::VSDateTime.new(val)
179
+ end
180
+
181
+ def double(t=nil)
182
+ val = self.read_double
183
+ dlog(t,val)
184
+ VSStubs::VSDouble.new(val)
185
+ end
186
+
187
+ def single(t=nil)
188
+ val = self.read_single
189
+ dlog(t,val)
190
+ VSStubs::VSSingle.new(val)
191
+ end
192
+
193
+ # VSStubs::VSValue types
194
+ def null(t=nil); dlog(t,nil); return VSStubs::VSValue.new(t); end
195
+ def empty_byte(t=nil); dlog(t,nil); return VSStubs::VSValue.new(t); end
196
+ def zeroint32(t=nil); dlog(t,nil); return VSStubs::VSValue.new(t); end
197
+ def bool_true(t=nil); dlog(t,nil); return VSStubs::VSValue.new(t); end
198
+ def bool_false(t=nil); dlog(t,nil); return VSStubs::VSValue.new(t); end
199
+ def empty_color(t=nil); dlog(t,nil); return VSStubs::VSValue.new(t); end
200
+ def empty_unit(t=nil); dlog(t,nil); return VSStubs::VSValue.new(t); end
201
+
202
+ # deserialize_value
203
+ def deserialize_value
204
+ @last_offset = @buf.pos
205
+ token = self.read_byte # self.read_raw_byte
206
+ if not (tsym = VIEWSTATE_TYPES[token])
207
+ STDERR.puts "TOKEN: [0x#{token.to_s(16)}] at #{last_offset}"
208
+ STDERR.puts @buf.read(32).hexdump
209
+ raise "Invalid Type [0x#{token.to_s(16)}] at #{last_offset}" if not (tsym = VIEWSTATE_TYPES[token])
210
+ end
211
+ nobj = self.send(tsym,token)
212
+ raise "Invalid Class Returned #{nobj.class}" if not VIEWSTATE_TYPES.include?(nobj.opcode)
213
+ return nobj
214
+ end
215
+
216
+ end
217
+ end