ronin-web-server 0.1.0 → 0.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b3dee3ef506c739a9e75e0e5055d5554759de129367000a5b87619e801d4fd2c
4
- data.tar.gz: 1695a44b07a156efff8b0611b148b585511fc9d3d844ad18b7834295e9bc3ec0
3
+ metadata.gz: 7641f362f496605dc130ab2e58bade6d6d22f47224f132d5c963c3f6179ff51e
4
+ data.tar.gz: ee3cc24d4ecc115259754d441e2d351a9c0ca8d1490468ee993b14f8f8981967
5
5
  SHA512:
6
- metadata.gz: e192f8ec835cb380ef519ed2b6ddfba88a40b8213fd1fa3f7d5df9b20f6b23cc75fe21b85bea0663fa52a0009a33b9c5b011697c8fc404760cdee5ed11f2a97e
7
- data.tar.gz: 06a4928fd050e6c85fc17195739b9c9233ef6c7547e8532d2893fa2257276194e25bb3ac54f92a46fa62f225b51b021ccee84c6426203e4627e777111a60eeea
6
+ metadata.gz: cce961a47f97df03f1819fa8ab1f601d15a7ab1f86091eca0e6faf663813314e461bb22e458c05ca63f2b21cb5940f3272de8dffcd1515c0d0d1346b0bd43c99
7
+ data.tar.gz: 57675264ab3fa96514c2330616b2e2f410e1e5fad091989fb2a062c51a126cbb4a06e7ebb77026b767c17bf54a90133ac348bd4faefdc91d0c356dcf5587ceeb
data/.rubocop.yml CHANGED
@@ -3,152 +3,12 @@ AllCops:
3
3
  SuggestExtensions: false
4
4
  TargetRubyVersion: 3.1
5
5
 
6
- #
7
- # our rules
8
- #
6
+ inherit_gem:
7
+ rubocop-ronin: rubocop.yml
9
8
 
10
- Layout/FirstArrayElementIndentation: { Exclude: ['spec/**/*'] }
11
- Layout/LineLength: { Enabled: false }
12
- Layout/SpaceAroundEqualsInParameterDefault: { EnforcedStyle: no_space }
13
- Lint/ConstantDefinitionInBlock: { Exclude: ['spec/**/*'] }
14
- Metrics: { Enabled: false }
15
- Style/SymbolArray: { EnforcedStyle: brackets }
16
- Style/IfInsideElse: { Enabled: false } # Offense count: 1
17
- Style/PercentLiteralDelimiters:
18
- Enabled: true
19
- PreferredDelimiters:
20
- default: '{}'
21
- '%i': '[]'
22
- '%I': '[]'
23
- '%w': '[]'
24
- '%W': '[]'
25
- Style/UnlessElse: { Enabled: false }
26
- Bundler/OrderedGems: { Enabled: false }
27
- Style/CaseEquality: { Exclude: ['lib/ronin/web/server/conditions.rb'] }
28
- Style/Next: { Enabled: false }
29
- Style/HashSyntax: { Enabled: false }
30
- Naming/BlockForwarding: { Enabled: false }
31
- Lint/ReturnInVoidContext: { Enabled: false }
32
- Gemspec/DeprecatedAttributeAssignment: { Enabled: false }
33
- Layout/EmptyLineAfterMagicComment: { Enabled: false }
34
-
35
- #
36
- # rules that are in flux
37
9
  #
38
-
39
- # consider enabling these and autocorrecting?
40
- # Layout/SpaceAfterComma
41
- # Layout/SpaceAroundKeyword
42
- # Layout/SpaceBeforeComma
43
- # Layout/SpaceInsideHashLiteralBraces
44
- # Layout/SpaceInsideParens
45
- # Layout/TrailingWhitespace
46
- # Lint/UnreachableLoop
47
- # Lint/UnusedBlockArgument
48
- # Style/ClassCheck
49
- # Style/Documentation
50
- # Style/ExpandPathArguments
51
- # Style/GlobalStdStream
52
- # Style/HashSyntax
53
- # Style/KeywordParametersOrder
54
- # Style/MethodCallWithoutArgsParentheses
55
- # Style/MutableConstant
56
- # Style/QuotedSymbols: { EnforcedStyle: double_quotes }
57
- # Style/RedundantReturn
58
- # Style/SafeNavigation
59
- # Style/SpecialGlobalVars
60
- # Style/StringLiterals: { EnforcedStyle: double_quotes }
61
- # Style/WordArray
62
-
63
- # these have been fixed
64
- # Gemspec/DuplicatedAssignment: { Enabled: false } # Offense count: 1
65
- # Layout/ElseAlignment: { Enabled: false } # Offense count: 1
66
- # Layout/EndAlignment: { Enabled: false } # Offense count: 1
67
- # Lint/DuplicateMethods: { Enabled: false } # Offense count: 1
68
- # Lint/UselessAssignment: { Enabled: false } # Offense count: 1
69
- # Style/Encoding: { Enabled: false } # Offense count: 2
70
- # Style/RedundantBegin: { Enabled: false } # Offense count: 2
71
- # Style/RedundantInterpolation: { Enabled: false } # Offense count: 1
72
- # Style/TrailingCommaInArrayLiteral: { Enabled: false } # Offense count: 1
73
-
10
+ # ronin-web-server specific exceptions
74
11
  #
75
- # This list was generated with:
76
- # bundle exec rubocop --auto-gen-config --exclude-limit 1
77
- #
78
-
79
- # > 10 violations
80
- Layout/AssignmentIndentation: { Enabled: false } # Offense count: 11
81
- Layout/EmptyLinesAroundClassBody: { Enabled: false } # Offense count: 76
82
- Layout/HashAlignment: { Enabled: false } # Offense count: 28
83
- Layout/SpaceAfterComma: { Enabled: false } # Offense count: 141
84
- Layout/SpaceInsideHashLiteralBraces: { Enabled: false } # Offense count: 57
85
- Layout/TrailingWhitespace: { Enabled: false } # Offense count: 50
86
- Naming/RescuedExceptionsVariableName: { Enabled: false } # Offense count: 11
87
- Style/BlockDelimiters: { Enabled: false } # Offense count: 17
88
- Style/ClassCheck: { Enabled: false } # Offense count: 10
89
- Style/ClassEqualityComparison: { Enabled: false } # Offense count: 16
90
- Style/FrozenStringLiteralComment: { Enabled: false } # Offense count: 77
91
- Style/GlobalStdStream: { Enabled: false } # Offense count: 13
92
- Style/GuardClause: { Enabled: false } # Offense count: 10
93
- Style/IfUnlessModifier: { Enabled: false } # Offense count: 13
94
- Style/MethodCallWithoutArgsParentheses: { Enabled: false } # Offense count: 10
95
- Style/SpecialGlobalVars: { Enabled: false } # Offense count: 28
96
- Style/StringLiterals: { Enabled: false } # Offense count: 774
97
- Lint/ElseLayout: { Enabled: false } # Offense count: 22
98
-
99
- # < 10 violations
100
- Layout/EmptyLinesAroundModuleBody: { Enabled: false } # Offense count: 5
101
- Layout/ExtraSpacing: { Enabled: false } # Offense count: 6
102
- Layout/FirstHashElementIndentation: { Enabled: false } # Offense count: 4
103
- Layout/ParameterAlignment: { Enabled: false } # Offense count: 9
104
- Layout/SpaceAroundKeyword: { Enabled: false } # Offense count: 7
105
- Layout/SpaceBeforeComma: { Enabled: false } # Offense count: 4
106
- Layout/SpaceInsideParens: { Enabled: false } # Offense count: 4
107
- Lint/EmptyClass: { Enabled: false } # Offense count: 3
108
- Lint/SuppressedException: { Enabled: false } # Offense count: 4
109
- Lint/UnusedMethodArgument: { Enabled: false } # Offense count: 5
110
- Style/AccessorGrouping: { Enabled: false } # Offense count: 7
111
- Style/Documentation: { Enabled: false } # Offense count: 3
112
- Style/ExpandPathArguments: { Enabled: false } # Offense count: 8
113
- Style/KeywordParametersOrder: { Enabled: false } # Offense count: 8
114
- Style/Lambda: { Enabled: false } # Offense count: 3
115
- Style/MutableConstant: { Enabled: false } # Offense count: 4
116
- Style/RaiseArgs: { Enabled: false } # Offense count: 4
117
- Style/RedundantReturn: { Enabled: false } # Offense count: 7
118
- Style/SafeNavigation: { Enabled: false } # Offense count: 5
119
- Style/StringConcatenation: { Enabled: false } # Offense count: 8
120
- Style/WordArray: { Enabled: false } # Offense count: 4
121
-
122
- # 1 or 2 violations
123
- Layout/ArgumentAlignment: { Enabled: false } # Offense count: 1
124
- Layout/BlockAlignment: { Enabled: false } # Offense count: 1
125
- Layout/IndentationWidth: { Enabled: false } # Offense count: 2
126
- Layout/SpaceAroundOperators: { Enabled: false } # Offense count: 1
127
- Layout/SpaceBeforeBlockBraces: { Enabled: false } # Offense count: 1
128
- Lint/MissingSuper: { Enabled: false } # Offense count: 2
129
- Lint/RescueException: { Enabled: false } # Offense count: 1
130
- Lint/UnreachableLoop: { Enabled: false } # Offense count: 1
131
- Lint/UnusedBlockArgument: { Enabled: false } # Offense count: 1
132
- Naming/MethodParameterName: { Enabled: false } # Offense count: 1
133
- Style/EmptyMethod: { Enabled: false } # Offense count: 2
134
- Style/HashConversion: { Enabled: false } # Offense count: 1
135
- Style/MultilineMemoization: { Enabled: false } # Offense count: 1
136
- Style/NumericPredicate: { Enabled: false } # Offense count: 1
137
- Style/OptionalArguments: { Enabled: false } # Offense count: 1
138
- Style/ParenthesesAroundCondition: { Enabled: false } # Offense count: 1
139
- Style/PreferredHashMethods: { Enabled: false } # Offense count: 1
140
- Style/QuotedSymbols: { Enabled: false } # Offense count: 1
141
- Style/RedundantException: { Enabled: false } # Offense count: 1
142
- Style/RedundantRegexpEscape: { Enabled: false } # Offense count: 1
143
- Style/RegexpLiteral: { Enabled: false } # Offense count: 1
144
- Style/RescueStandardError: { Enabled: false } # Offense count: 1
145
- Style/SoleNestedConditional: { Enabled: false } # Offense count: 1
146
- Style/TrailingCommaInHashLiteral: { Enabled: false } # Offense count: 2
147
-
148
- # rubocop cannot tell that rubygems_mfa_required is enabled in gemspec.yml
149
- Gemspec/RequireMFA: { Enabled: false }
150
-
151
- # make an exception for our gemspec code
152
- Gemspec/DuplicatedAssignment:
12
+ Style/CaseEquality:
153
13
  Exclude:
154
- - 'ronin-web-server.gemspec'
14
+ - 'lib/ronin/web/server/conditions.rb'
data/ChangeLog.md CHANGED
@@ -1,4 +1,11 @@
1
- ### 0.1.0 / 2023-XX-XX
1
+ ### 0.1.1 / 2023-03-01
2
+
3
+ * Correctly set the `bind` setting in {Ronin::Web::Server::Base} to ensure it
4
+ will always listen on `0.0.0.0`.
5
+ * Allow `directory` and `mount` to accept directory paths ending with a `/`.
6
+ * Increased test coverage.
7
+
8
+ ### 0.1.0 / 2023-02-01
2
9
 
3
10
  * Extracted and refactored from [ronin-web](https://github.com/ronin-rb/ronin-web/tree/v0.3.0.rc1).
4
11
  * Relicensed as LGPL-3.0.
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gemspec
@@ -28,8 +30,9 @@ group :development do
28
30
  gem 'yard', '~> 0.9'
29
31
  gem 'yard-spellcheck', require: false
30
32
 
31
- gem 'dead_end', require: false
32
- gem 'sord', require: false, platform: :mri
33
- gem 'stackprof', require: false, platform: :mri
34
- gem 'rubocop', require: false
33
+ gem 'dead_end', require: false
34
+ gem 'sord', require: false, platform: :mri
35
+ gem 'stackprof', require: false, platform: :mri
36
+ gem 'rubocop', require: false, platform: :mri
37
+ gem 'rubocop-ronin', require: false, platform: :mri
35
38
  end
data/README.md CHANGED
@@ -59,7 +59,7 @@ security research and development.
59
59
  * [os_version][docs-os_version] - matches the OS version from the `User-Agent`
60
60
  header of the request.
61
61
  * Has 97% documentation coverage.
62
- * Has 85% test coverage.
62
+ * Has 90% test coverage.
63
63
 
64
64
  [docs-any]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Routing/ClassMethods.html#any-instance_method
65
65
  [docs-default]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Routing/ClassMethods.html#default-instance_method
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- require 'rubygems'
1
+ # frozen_string_literal: true
2
2
 
3
3
  begin
4
4
  require 'bundler'
@@ -94,28 +94,28 @@ module Ronin
94
94
  # based on the OS version within the `User-Agent` header.
95
95
  #
96
96
  # ## Examples
97
- #
97
+ #
98
98
  # require 'ronin/web/server'
99
- #
99
+ #
100
100
  # class App < Ronin::Web::Server::Base
101
- #
101
+ #
102
102
  # # mount a file
103
103
  # file '/sitemap.xml', './files/sitemap.xml'
104
104
  #
105
105
  # # mount a directory
106
106
  # directory '/downloads/', '/tmp/downloads/'
107
- #
107
+ #
108
108
  # get '/' do
109
109
  # # renders views/index.erb
110
110
  # erb :index
111
111
  # end
112
- #
112
+ #
113
113
  # get '/test' do
114
114
  # "raw text here"
115
115
  # end
116
- #
116
+ #
117
117
  # end
118
- #
118
+ #
119
119
  # App.run!
120
120
  #
121
121
  class Base < Sinatra::Base
@@ -132,7 +132,7 @@ module Ronin
132
132
 
133
133
  use Rack::UserAgent
134
134
 
135
- set :host, DEFAULT_HOST
135
+ set :bind, DEFAULT_HOST
136
136
  set :port, DEFAULT_PORT
137
137
 
138
138
  before do
@@ -279,7 +279,7 @@ module Ronin
279
279
  #
280
280
  # @example Match versions of Chrome with known vulnerabilities:
281
281
  # vuln_versions = File.readlines('chrome_versions.txt', chomp: true)
282
- #
282
+ #
283
283
  # get '/path', browser: :chrome, browser_version: vuln_versions do
284
284
  # # ...
285
285
  # end
@@ -415,7 +415,7 @@ module Ronin
415
415
  #
416
416
  # @example Match versions of Android with known vulnerabilities:
417
417
  # vuln_versions = File.readlines('android_versions.txt', chomp: true)
418
- #
418
+ #
419
419
  # get '/path', os: :android, os_version: vuln_versions do
420
420
  # # ...
421
421
  # end
@@ -28,7 +28,6 @@ module Ronin
28
28
  # Provides Sinatra routing and helper methods.
29
29
  #
30
30
  module Helpers
31
-
32
31
  include Rack::Utils
33
32
  include Sinatra::Helpers
34
33
 
@@ -63,6 +63,7 @@ module Ronin
63
63
  if name =~ /^HTTP_/
64
64
  header_words = name[5..].split('_')
65
65
  header_words.each(&:capitalize!)
66
+
66
67
  header_name = header_words.join('-')
67
68
 
68
69
  headers[header_name] = value
@@ -38,7 +38,7 @@ module Ronin
38
38
  # proxy.on_request do |request|
39
39
  # # ...
40
40
  # end
41
- #
41
+ #
42
42
  # proxy.on_response do |response|
43
43
  # # ...
44
44
  # end
@@ -48,9 +48,9 @@ module Ronin
48
48
  # ### App
49
49
  #
50
50
  # class App < Ronin::Web::Server::Base
51
- #
51
+ #
52
52
  # mount '/signin', Ronin::Web::Server::ReverseProxy.new
53
- #
53
+ #
54
54
  # end
55
55
  #
56
56
  # @api public
@@ -179,10 +179,11 @@ module Ronin
179
179
  headers = request.headers
180
180
  body = request.body.read
181
181
 
182
- http = connection_for(host,port, ssl: ssl)
182
+ http = connection_for(host,port, ssl: ssl)
183
183
  http_response = http.request(method,path, query: query,
184
184
  headers: headers,
185
185
  body: body)
186
+
186
187
  response_headers = {}
187
188
 
188
189
  http_response.each_capitalized do |name,value|
@@ -228,12 +229,12 @@ module Ronin
228
229
  def run!(host: DEFAULT_HOST, port: DEFAULT_PORT, server: DEFAULT_SERVER,
229
230
  **rack_options)
230
231
  server = Rack::Server.new(
231
- app: self,
232
- server: server,
233
- Host: host,
234
- Port: port,
235
- **rack_options
236
- )
232
+ app: self,
233
+ server: server,
234
+ Host: host,
235
+ Port: port,
236
+ **rack_options
237
+ )
237
238
 
238
239
  server.start do |handler|
239
240
  trap(:INT) { quit!(server,handler) }
@@ -84,7 +84,7 @@ module Ronin
84
84
  # default do
85
85
  # status 200
86
86
  # content_type :html
87
- #
87
+ #
88
88
  # %{
89
89
  # <html>
90
90
  # <body>
@@ -120,7 +120,7 @@ module Ronin
120
120
  #
121
121
  def basic_auth(auth_user,auth_password, realm: 'Restricted')
122
122
  use Rack::Auth::Basic, realm do |user,password|
123
- user == auth_user && passwrd == auth_password
123
+ user == auth_user && password == auth_password
124
124
  end
125
125
  end
126
126
 
@@ -145,10 +145,10 @@ module Ronin
145
145
  #
146
146
  # Hosts the contents of a file.
147
147
  #
148
- # @param [String, Regexp] remote_path
148
+ # @param [String, Regexp] path
149
149
  # The path the web server will host the file at.
150
150
  #
151
- # @param [String] local_path
151
+ # @param [String] local_file
152
152
  # The path to the local file.
153
153
  #
154
154
  # @param [Hash{Symbol => Object}] conditions
@@ -159,17 +159,17 @@ module Ronin
159
159
  #
160
160
  # @api public
161
161
  #
162
- def file(remote_path,local_path,conditions={})
163
- get(remote_path,conditions) { send_file(local_path) }
162
+ def file(path,local_file,conditions={})
163
+ get(path,conditions) { send_file(local_file) }
164
164
  end
165
165
 
166
166
  #
167
167
  # Hosts the contents of the directory.
168
168
  #
169
- # @param [String] remote_path
169
+ # @param [String] path
170
170
  # The path the web server will host the directory at.
171
171
  #
172
- # @param [String] local_path
172
+ # @param [String] local_dir
173
173
  # The path to the local directory.
174
174
  #
175
175
  # @param [Hash{Symbol => Object}] conditions
@@ -180,10 +180,11 @@ module Ronin
180
180
  #
181
181
  # @api public
182
182
  #
183
- def directory(remote_path,local_path,conditions={})
184
- dir = Rack::File.new(local_path)
183
+ def directory(path,local_dir,conditions={})
184
+ path = path.chomp('/')
185
+ dir = Rack::File.new(local_dir)
185
186
 
186
- get("#{remote_path}/*",conditions) do |sub_path|
187
+ get("#{path}/*",conditions) do |sub_path|
187
188
  response = dir.call(env.merge('PATH_INFO' => "/#{sub_path}"))
188
189
 
189
190
  if response[0] == 200 then response
@@ -207,7 +208,7 @@ module Ronin
207
208
  # @api public
208
209
  #
209
210
  def public_dir(path,conditions={})
210
- directory('',path,conditions)
211
+ directory('/',path,conditions)
211
212
  end
212
213
 
213
214
  #
@@ -250,6 +251,8 @@ module Ronin
250
251
  # @api public
251
252
  #
252
253
  def mount(dir,app,conditions={})
254
+ dir = dir.chomp('/')
255
+
253
256
  any("#{dir}/?*",conditions) do |sub_path|
254
257
  app.call(env.merge('PATH_INFO' => "/#{sub_path}"))
255
258
  end
@@ -22,7 +22,7 @@ module Ronin
22
22
  module Web
23
23
  module Server
24
24
  # ronin-web-server version
25
- VERSION = '0.1.0'
25
+ VERSION = '0.1.1'
26
26
  end
27
27
  end
28
28
  end
@@ -22,6 +22,11 @@ require 'ronin/web/server/base'
22
22
  require 'ronin/web/server/app'
23
23
 
24
24
  module Ronin
25
+ #
26
+ # Namespace for [ronin-web].
27
+ #
28
+ # [ronin-web]: https://github.com/ronin-rb/ronin-web#readme
29
+ #
25
30
  module Web
26
31
  #
27
32
  # Returns the Ronin Web Server.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'yaml'
2
4
 
3
5
  Gem::Specification.new do |gem|
@@ -20,7 +22,7 @@ Gem::Specification.new do |gem|
20
22
  gem.homepage = gemspec['homepage']
21
23
  gem.metadata = gemspec['metadata'] if gemspec['metadata']
22
24
 
23
- glob = lambda { |patterns| gem.files & Dir[*patterns] }
25
+ glob = ->(patterns) { gem.files & Dir[*patterns] }
24
26
 
25
27
  gem.files = `git ls-files`.split($/)
26
28
  gem.files = glob[gemspec['files']] if gemspec['files']
@@ -44,7 +46,7 @@ Gem::Specification.new do |gem|
44
46
  gem.required_rubygems_version = gemspec['required_rubygems_version']
45
47
  gem.post_install_message = gemspec['post_install_message']
46
48
 
47
- split = lambda { |string| string.split(/,\s*/) }
49
+ split = ->(string) { string.split(/,\s*/) }
48
50
 
49
51
  if gemspec['dependencies']
50
52
  gemspec['dependencies'].each do |name,versions|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ronin-web-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Postmodern
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-01 00:00:00.000000000 Z
11
+ date: 2023-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: webrick