ronin-web-server 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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