ronin 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/History.txt +50 -0
  2. data/Manifest.txt +31 -19
  3. data/README.txt +27 -19
  4. data/Rakefile +1 -1
  5. data/TODO.txt +1 -7
  6. data/lib/ronin.rb +1 -11
  7. data/lib/ronin/database/database.rb +1 -1
  8. data/lib/ronin/{cache/config.rb → environment.rb} +10 -8
  9. data/lib/ronin/formatting.rb +0 -1
  10. data/lib/ronin/formatting/extensions.rb +0 -1
  11. data/lib/ronin/formatting/extensions/binary/integer.rb +10 -0
  12. data/lib/ronin/formatting/extensions/binary/string.rb +11 -0
  13. data/lib/ronin/formatting/extensions/http/string.rb +1 -1
  14. data/lib/ronin/network/extensions/http/net.rb +8 -0
  15. data/lib/ronin/objectify/objectify.rb +0 -47
  16. data/lib/ronin/os.rb +89 -0
  17. data/lib/ronin/platform.rb +4 -77
  18. data/lib/ronin/{cache → platform}/exceptions.rb +2 -2
  19. data/lib/ronin/{cache → platform}/exceptions/extension_not_found.rb +1 -1
  20. data/lib/ronin/{cache → platform}/exceptions/overlay_cached.rb +1 -1
  21. data/lib/ronin/{cache → platform}/exceptions/overlay_not_found.rb +1 -1
  22. data/lib/ronin/{cache → platform}/extension.rb +68 -177
  23. data/lib/ronin/{cache → platform}/extension_cache.rb +9 -7
  24. data/lib/ronin/{cache → platform}/maintainer.rb +1 -1
  25. data/lib/ronin/platform/object_cache.rb +94 -0
  26. data/lib/ronin/platform/overlay.rb +274 -0
  27. data/lib/ronin/platform/overlay_cache.rb +318 -0
  28. data/lib/ronin/platform/platform.rb +195 -0
  29. data/lib/ronin/{cache → platform}/ronin.rb +7 -6
  30. data/lib/ronin/target.rb +5 -5
  31. data/lib/ronin/ui.rb +4 -1
  32. data/lib/ronin/ui/command_line/command_line.rb +0 -1
  33. data/lib/ronin/ui/command_line/commands/add.rb +21 -6
  34. data/lib/ronin/ui/command_line/commands/default.rb +6 -1
  35. data/lib/ronin/ui/command_line/commands/extension.rb +3 -3
  36. data/lib/ronin/ui/command_line/commands/install.rb +16 -5
  37. data/lib/ronin/ui/command_line/commands/list.rb +31 -8
  38. data/lib/ronin/ui/command_line/commands/overlay.rb +10 -9
  39. data/lib/ronin/ui/command_line/commands/remove.rb +16 -5
  40. data/lib/ronin/ui/command_line/commands/uninstall.rb +16 -5
  41. data/lib/ronin/ui/command_line/commands/update.rb +16 -3
  42. data/lib/ronin/ui/console.rb +81 -77
  43. data/lib/ronin/ui/diagnostics.rb +73 -0
  44. data/lib/ronin/version.rb +1 -1
  45. data/spec/chars/chars_spec.rb +1 -3
  46. data/spec/formatting/binary/integer_spec.rb +48 -36
  47. data/spec/formatting/binary/string_spec.rb +66 -4
  48. data/spec/os_spec.rb +24 -0
  49. data/spec/platform/extension_cache_spec.rb +42 -0
  50. data/spec/platform/extension_spec.rb +62 -0
  51. data/spec/platform/helpers/overlays.rb +18 -0
  52. data/spec/platform/helpers/overlays.yaml.erb +10 -0
  53. data/spec/platform/helpers/overlays/hello/hello/extension.rb +7 -0
  54. data/spec/platform/helpers/overlays/hello/ronin.xml +26 -0
  55. data/spec/platform/helpers/overlays/test1/ronin.xml +26 -0
  56. data/spec/platform/helpers/overlays/test1/test/extension.rb +7 -0
  57. data/spec/platform/helpers/overlays/test2/ronin.xml +26 -0
  58. data/spec/platform/helpers/overlays/test2/test/extension.rb +7 -0
  59. data/spec/platform/overlay_cache_spec.rb +63 -0
  60. data/spec/platform/platform_spec.rb +14 -0
  61. data/spec/platform/ronin_spec.rb +22 -0
  62. data/spec/target_spec.rb +1 -1
  63. data/spec/ui/diagnostics_spec.rb +17 -0
  64. metadata +34 -22
  65. data/lib/ronin/cache.rb +0 -27
  66. data/lib/ronin/cache/cache.rb +0 -78
  67. data/lib/ronin/cache/overlay.rb +0 -470
  68. data/lib/ronin/cache/overlay_cache.rb +0 -216
  69. data/lib/ronin/formatting/extensions/html.rb +0 -24
  70. data/lib/ronin/formatting/extensions/html/string.rb +0 -75
  71. data/lib/ronin/formatting/html.rb +0 -24
  72. data/spec/formatting/html_spec.rb +0 -46
  73. data/spec/platform_spec.rb +0 -24
data/History.txt CHANGED
@@ -1,3 +1,53 @@
1
+ === 0.2.0 / 2009-02-06
2
+
3
+ * Moved the HTML formatting methods into the
4
+ {ronin-html}[http://ronin.rubyforge.org/html/] library.
5
+ * Added 'ronin/environment' which loads the Ronin Environment.
6
+ * Added the --database option to the DefaultCommand.
7
+ * Added the -C option to the add, install, list, update, remove and
8
+ uninstall commands.
9
+ * Added String#hex_escape.
10
+ * Added Net.http_ok?.
11
+ * Added UI::Diagnostics.
12
+ * Require Contextify >= 0.1.2 for the self.load_context_block method.
13
+ * Renamed Platform to Ronin::OS.
14
+ * Renamed Cache to Ronin::Platform.
15
+ * Refactored Ronin::Platform:
16
+ * Added Overlay#activate!.
17
+ * Added Overlay#deactivate!.
18
+ * Added a title attribute to Ronin::Platform::Overlay.
19
+ * Added a dirty flag to Ronin::Platform::OverlayCache to reduce
20
+ unnecessary writes.
21
+ * Added OverlayCache#has_extension?.
22
+ * Added Ronin::Platform::ObjectCache to handle the mass caching/mirroring
23
+ of object contexts.
24
+ * Added Platform.add.
25
+ * Added Platform.install.
26
+ * Added Platform.update.
27
+ * Added Platform.remove.
28
+ * Added Platform.uninstall.
29
+ * Added Platform::Extension#find_paths.
30
+ * Added specs for:
31
+ * Ronin::Platform.
32
+ * Ronin::Platform::Overlay.
33
+ * Ronin::Platform::OverlayCache.
34
+ * Ronin::Platform::Extension.
35
+ * Ronin::Platform::ExtensionCache.
36
+ * Shortened method names.
37
+ * Renamed OverlayCache#has_overlay? to OverlayCache#has?.
38
+ * Renamed OverlayCache#get_overlay to OverlayCache#get.
39
+ * Renamed OverlayCache#overlay_with to OverlayCache#with.
40
+ * Renamed Extension#was_setup? to Extension#setup?.
41
+ * Renamed Extension#was_toredown? to Extension#toredown?.
42
+ * Renamed Extension#perform_setup to Extension#setup!.
43
+ * Renamed Extension#perform_teardown to Extension#teardown!.
44
+ * Removed un-used or surpurfulous methods.
45
+ * Removed 'lib/ronin/platform/config.rb'.
46
+ * Allow Overlays to have their own <tt>lib/</tt> directories.
47
+ * Many bug fixes.
48
+ * Updated the README.txt.
49
+ * Fixed bug in UI::Console.auto_load and UI::Console.start.
50
+
1
51
  === 0.1.4 / 2009-01-22
2
52
 
3
53
  * Moved Ronin::Web and Ronin::Sessions::Web into the ronin-web library.
data/Manifest.txt CHANGED
@@ -20,7 +20,6 @@ lib/ronin/formatting.rb
20
20
  lib/ronin/formatting/digest.rb
21
21
  lib/ronin/formatting/binary.rb
22
22
  lib/ronin/formatting/text.rb
23
- lib/ronin/formatting/html.rb
24
23
  lib/ronin/formatting/http.rb
25
24
  lib/ronin/formatting/extensions.rb
26
25
  lib/ronin/formatting/extensions/digest.rb
@@ -30,8 +29,6 @@ lib/ronin/formatting/extensions/binary/integer.rb
30
29
  lib/ronin/formatting/extensions/binary/string.rb
31
30
  lib/ronin/formatting/extensions/text.rb
32
31
  lib/ronin/formatting/extensions/text/string.rb
33
- lib/ronin/formatting/extensions/html.rb
34
- lib/ronin/formatting/extensions/html/string.rb
35
32
  lib/ronin/formatting/extensions/http.rb
36
33
  lib/ronin/formatting/extensions/http/string.rb
37
34
  lib/ronin/chars.rb
@@ -104,7 +101,7 @@ lib/ronin/author.rb
104
101
  lib/ronin/license.rb
105
102
  lib/ronin/has_license.rb
106
103
  lib/ronin/arch.rb
107
- lib/ronin/platform.rb
104
+ lib/ronin/os.rb
108
105
  lib/ronin/target.rb
109
106
  lib/ronin/product.rb
110
107
  lib/ronin/objectify.rb
@@ -113,20 +110,22 @@ lib/ronin/objectify/exceptions/object_context_not_found.rb
113
110
  lib/ronin/objectify/exceptions/unknown_object_context.rb
114
111
  lib/ronin/objectify/objectify.rb
115
112
  lib/ronin/models.rb
116
- lib/ronin/cache.rb
117
- lib/ronin/cache/exceptions.rb
118
- lib/ronin/cache/exceptions/extension_not_found.rb
119
- lib/ronin/cache/exceptions/overlay_cached.rb
120
- lib/ronin/cache/exceptions/overlay_not_found.rb
121
- lib/ronin/cache/overlay_cache.rb
122
- lib/ronin/cache/maintainer.rb
123
- lib/ronin/cache/overlay.rb
124
- lib/ronin/cache/config.rb
125
- lib/ronin/cache/extension_cache.rb
126
- lib/ronin/cache/extension.rb
127
- lib/ronin/cache/cache.rb
128
- lib/ronin/cache/ronin.rb
113
+ lib/ronin/environment.rb
114
+ lib/ronin/platform.rb
115
+ lib/ronin/platform/exceptions.rb
116
+ lib/ronin/platform/exceptions/extension_not_found.rb
117
+ lib/ronin/platform/exceptions/overlay_cached.rb
118
+ lib/ronin/platform/exceptions/overlay_not_found.rb
119
+ lib/ronin/platform/maintainer.rb
120
+ lib/ronin/platform/overlay.rb
121
+ lib/ronin/platform/overlay_cache.rb
122
+ lib/ronin/platform/object_cache.rb
123
+ lib/ronin/platform/extension_cache.rb
124
+ lib/ronin/platform/extension.rb
125
+ lib/ronin/platform/platform.rb
126
+ lib/ronin/platform/ronin.rb
129
127
  lib/ronin/ui.rb
128
+ lib/ronin/ui/diagnostics.rb
130
129
  lib/ronin/ui/hexdump.rb
131
130
  lib/ronin/ui/hexdump/hexdump.rb
132
131
  lib/ronin/ui/hexdump/extensions.rb
@@ -170,17 +169,30 @@ spec/extensions/uri/query_params_spec.rb
170
169
  spec/formatting/binary/integer_spec.rb
171
170
  spec/formatting/binary/string_spec.rb
172
171
  spec/formatting/digest_spec.rb
173
- spec/formatting/html_spec.rb
174
172
  spec/formatting/http_spec.rb
175
173
  spec/formatting/text_spec.rb
176
174
  spec/code/reference_spec.rb
177
175
  spec/code/symbol_table_spec.rb
178
176
  spec/license_spec.rb
179
177
  spec/path_spec.rb
180
- spec/platform_spec.rb
178
+ spec/os_spec.rb
181
179
  spec/product_spec.rb
182
180
  spec/target_spec.rb
183
181
  spec/sessions/session_spec.rb
182
+ spec/platform/helpers/overlays.rb
183
+ spec/platform/helpers/overlays.yaml.erb
184
+ spec/platform/helpers/overlays/test1/ronin.xml
185
+ spec/platform/helpers/overlays/test1/test/extension.rb
186
+ spec/platform/helpers/overlays/test2/ronin.xml
187
+ spec/platform/helpers/overlays/test2/test/extension.rb
188
+ spec/platform/helpers/overlays/hello/ronin.xml
189
+ spec/platform/helpers/overlays/hello/hello/extension.rb
190
+ spec/platform/extension_spec.rb
191
+ spec/platform/overlay_cache_spec.rb
192
+ spec/platform/extension_cache_spec.rb
193
+ spec/platform/platform_spec.rb
194
+ spec/platform/ronin_spec.rb
195
+ spec/ui/diagnostics_spec.rb
184
196
  spec/ui/command_line/param_parser_spec.rb
185
197
  spec/ronin_spec.rb
186
198
  static/overlay.xsl
data/README.txt CHANGED
@@ -51,7 +51,6 @@ of Ronin.
51
51
  * Binary
52
52
  * HTTP
53
53
  * URIs
54
- * HTML
55
54
  * Generating random text.
56
55
  * Networking:
57
56
  * TCP
@@ -68,7 +67,8 @@ of Ronin.
68
67
 
69
68
  == REQUIREMENTS:
70
69
 
71
- * DataMapper:
70
+ * {libsqlite3}[http://sqlite.org/]
71
+ * {DataMapper}[http://datamapper.org/]:
72
72
  * dm-core >= 0.9.9
73
73
  * data_objects >= 0.9.9
74
74
  * do_sqlite3 >= 0.9.9
@@ -76,11 +76,11 @@ of Ronin.
76
76
  * dm-aggregates >= 0.9.9
77
77
  * dm-validations >= 0.9.9
78
78
  * dm-serializer >= 0.9.9
79
- * dm-prefined >= 0.1.0
80
- * parameters >= 0.1.2
81
- * contextify >= 0.1.0
82
- * reverse-require >= 0.3.1
83
- * repertoire >= 0.1.2
79
+ * {dm-prefined}[http://dm-predefined.rubyforge.org/] >= 0.1.0
80
+ * {parameters}[http://parameters.rubyforge.org/] >= 0.1.2
81
+ * {contextify}[http://contextify.rubyforge.org/] >= 0.1.0
82
+ * {reverse-require}[http://reverserequire.rubyforge.org/] >= 0.3.1
83
+ * {repertoire}[http://repertoire.rubyforge.org/] >= 0.1.2
84
84
 
85
85
  == INSTALL:
86
86
 
@@ -122,55 +122,63 @@ of Ronin.
122
122
 
123
123
  == RONIN LIBRARIES:
124
124
 
125
- === RONIN ASM
125
+ === Ronin ASM
126
126
 
127
- * http://ronin.rubyforge.org/libraries/asm.html
127
+ * http://ronin.rubyforge.org/asm/
128
128
  * http://github.com/postmodern/ronin-asm
129
129
 
130
130
  Ronin ASM is a Ruby library for Ronin that provides dynamic Assembly (ASM)
131
131
  generation of programs or shellcode.
132
132
 
133
- === RONIN DORKS
133
+ === Ronin Dorks
134
134
 
135
- * http://ronin.rubyforge.org/libraries/dorks.html
135
+ * http://ronin.rubyforge.org/dorks/
136
136
  * http://github.com/postmodern/ronin-dorks
137
137
 
138
138
  Ronin Dorks is a Ruby library for Ronin that provides support for various
139
139
  Google (tm) Dorks functionality.
140
140
 
141
- === RONIN EXPLOITS
141
+ === Ronin Exploits
142
142
 
143
- * http://ronin.rubyforge.org/libraries/exploits.html
143
+ * http://ronin.rubyforge.org/exploits/
144
144
  * http://github.com/postmodern/ronin-exploits
145
145
 
146
146
  Ronin Exploits is a Ruby library for Ronin that provides exploitation and
147
147
  payload crafting functionality.
148
148
 
149
- === RONIN HTML
149
+ === Ronin HTML
150
150
 
151
- * http://ronin.rubyforge.org/libraries/html.html
151
+ * http://ronin.rubyforge.org/html/
152
152
  * http://github.com/postmodern/ronin-html
153
153
 
154
154
  Ronin HTML is a Ruby library for Ronin that provides support for generating
155
155
  complex HTML/JavaScript or crafting XSS/CSRF attacks.
156
156
 
157
- === RONIN SQL
157
+ === Ronin SQL
158
158
 
159
- * http://ronin.rubyforge.org/libraries/sql.html
159
+ * http://ronin.rubyforge.org/sql/
160
160
  * http://github.com/postmodern/ronin-sql
161
161
 
162
162
  Ronin SQL is a Ruby library for Ronin that provids support for SQL related
163
163
  security tasks, such as scanning for and exploiting SQL injections.
164
164
 
165
- === RONIN PHP
165
+ === Ronin PHP
166
166
 
167
- * http://ronin.rubyforge.org/libraries/php.html
167
+ * http://ronin.rubyforge.org/php/
168
168
  * http://github.com/postmodern/ronin-php
169
169
 
170
170
  Ronin PHP is a Ruby library for Ronin that provides support for PHP related
171
171
  security tasks, such as finding and exploiting Local File Inclusion (LFI)
172
172
  and Remote File Inclusion (RFI).
173
173
 
174
+ === Ronin Web
175
+
176
+ * http://ronin.rubyforge.org/web/
177
+ * http://github.com/postmodern/ronin-web
178
+
179
+ Ronin Web is a Ruby library for Ronin that provides support for web
180
+ scraping and spidering functionality.
181
+
174
182
  == LICENSE:
175
183
 
176
184
  Ronin - A Ruby platform designed for information security and data
data/Rakefile CHANGED
@@ -19,7 +19,7 @@ Hoe.new('ronin', Ronin::VERSION) do |p|
19
19
  ['dm-validations', '>=0.9.9'],
20
20
  ['dm-predefined', '>=0.1.0'],
21
21
  ['parameters', '>=0.1.3'],
22
- ['contextify', '>=0.1.0'],
22
+ ['contextify', '>=0.1.2'],
23
23
  ['reverse-require', '>=0.3.1'],
24
24
  ['repertoire', '>=0.1.2']
25
25
  ]
data/TODO.txt CHANGED
@@ -1,12 +1,6 @@
1
1
  == TODO
2
2
 
3
- === Ronin 0.1.5:
4
-
5
- * Add diagonstic logging of this format:
6
-
7
- [*] Message
8
-
9
- === Ronin 0.2.0:
3
+ === Ronin 0.3.0:
10
4
 
11
5
  * Create an IO proxy class and RPC Service for proxying io.
12
6
  * Create a module for pivoting.
data/lib/ronin.rb CHANGED
@@ -21,15 +21,5 @@
21
21
  #++
22
22
  #
23
23
 
24
- require 'ronin/config'
25
- require 'ronin/extensions'
26
- require 'ronin/formatting'
27
- require 'ronin/chars'
28
- require 'ronin/path'
29
- require 'ronin/network'
30
- require 'ronin/models'
31
- require 'ronin/ui'
32
- require 'ronin/ronin'
24
+ require 'ronin/environment'
33
25
  require 'ronin/version'
34
-
35
- Ronin::Config.load
@@ -23,7 +23,7 @@
23
23
 
24
24
  require 'ronin/database/exceptions/invalid_config'
25
25
  require 'ronin/arch'
26
- require 'ronin/platform'
26
+ require 'ronin/os'
27
27
  require 'ronin/author'
28
28
  require 'ronin/license'
29
29
  require 'ronin/product'
@@ -22,13 +22,15 @@
22
22
  #
23
23
 
24
24
  require 'ronin/config'
25
+ require 'ronin/extensions'
26
+ require 'ronin/formatting'
27
+ require 'ronin/chars'
28
+ require 'ronin/path'
29
+ require 'ronin/network'
30
+ require 'ronin/models'
31
+ require 'ronin/ui'
32
+ require 'ronin/ronin'
25
33
 
26
- module Ronin
27
- module Config
28
- # Path to overlays directory
29
- OVERLAY_DIR = File.join(Config::PATH,'overlays')
34
+ require 'pp'
30
35
 
31
- # Path to overlays cache file
32
- OVERLAY_CACHE_PATH = File.join(Config::PATH,'overlays.yaml')
33
- end
34
- end
36
+ Ronin::Config.load
@@ -25,5 +25,4 @@ require 'ronin/formatting/extensions'
25
25
  require 'ronin/formatting/digest'
26
26
  require 'ronin/formatting/binary'
27
27
  require 'ronin/formatting/text'
28
- require 'ronin/formatting/html'
29
28
  require 'ronin/formatting/http'
@@ -23,4 +23,3 @@
23
23
 
24
24
  require 'ronin/formatting/extensions/binary'
25
25
  require 'ronin/formatting/extensions/http'
26
- require 'ronin/formatting/extensions/html'
@@ -56,4 +56,14 @@ class Integer
56
56
  return buffer
57
57
  end
58
58
 
59
+ #
60
+ # Returns the hex escaped form of the integer.
61
+ #
62
+ # 42.hex_escape
63
+ # # => "\\x2a"
64
+ #
65
+ def hex_escape
66
+ "\\x%.2x" % self
67
+ end
68
+
59
69
  end
@@ -21,6 +21,7 @@
21
21
  #++
22
22
  #
23
23
 
24
+ require 'ronin/formatting/extensions/text'
24
25
  require 'ronin/arch'
25
26
 
26
27
  require 'base64'
@@ -56,6 +57,16 @@ class String
56
57
  return integer
57
58
  end
58
59
 
60
+ #
61
+ # Returns the hex escaped form of the string.
62
+ #
63
+ # "hello".hex_escape
64
+ # # => "\\x68\\x65\\x6c\\x6c\\x6f"
65
+ #
66
+ def hex_escape(options={})
67
+ format_bytes(options) { |b| "\\x%.2x" % b }
68
+ end
69
+
59
70
  #
60
71
  # XOR encodes the string using the specified _key_.
61
72
  #
@@ -75,7 +75,7 @@ class String
75
75
  # # => "&#104;&#101;&#108;&#108;&#111;"
76
76
  #
77
77
  def format_http(options={})
78
- format_bytes(options) { |c| sprintf("%%%x",c) }
78
+ format_bytes(options) { |b| "%%%x" % b }
79
79
  end
80
80
 
81
81
  end
@@ -157,6 +157,14 @@ module Net
157
157
  end
158
158
  end
159
159
 
160
+ #
161
+ # Returns +true+ if a HTTP Head request with the given _options_ returns
162
+ # the HTTP status code of 200, returns +false+ otherwise.
163
+ #
164
+ def Net.http_ok?(options={})
165
+ Net.http_head(options).code == 200
166
+ end
167
+
160
168
  #
161
169
  # Performes an HTTP Lock request with the given _options_. If a _block_
162
170
  # is given, it will be passed the response from the HTTP server.
@@ -164,53 +164,6 @@ module Ronin
164
164
  return nil
165
165
  end
166
166
 
167
- #
168
- # Cache all objects loaded from the paths within the specified
169
- # _directory_.
170
- #
171
- def Objectify.cache_objects_in(directory)
172
- directory = File.expand_path(directory)
173
- paths = Dir[File.join(directory,'**','*.rb')]
174
-
175
- paths.each { |path| Objectify.cache_objects(path) }
176
- return nil
177
- end
178
-
179
- #
180
- # Mirror all objects that were previously cached from paths within
181
- # the specified _directory_. Also cache objects which have yet to
182
- # be cached.
183
- #
184
- def Objectify.mirror_objects_in(directory)
185
- directory = File.expand_path(directory)
186
- new_paths = Dir[File.join(directory,'**','*.rb')]
187
-
188
- Objectify.object_contexts.each_value do |base|
189
- objects = base.all(:object_path.like => "#{directory}%")
190
- new_paths -= objects.map { |obj| obj.object_path }
191
-
192
- # mirror existing objects
193
- objects.each { |obj| obj.mirror }
194
- end
195
-
196
- # cache the remaining new paths
197
- new_paths.each { |path| Objectify.cache_objects(path) }
198
- return nil
199
- end
200
-
201
- #
202
- # Deletes all cached objects that existed in the specified _directory_.
203
- #
204
- def Objectify.expunge_objects_from(directory)
205
- directory = File.expand_path(directory)
206
-
207
- Objectify.object_contexts.each_value do |base|
208
- base.all(:object_path.like => "#{directory}%").destroy!
209
- end
210
-
211
- return nil
212
- end
213
-
214
167
  #
215
168
  # Loads a new object from the file pointed to by the +object_path+
216
169
  # property.