ronin-web-server 0.1.0.beta3 → 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: 3c32a0fe8db0a81c16ca23b030e40e9b7037be55aa9ecbcaccf7d3f89f2cfae6
4
- data.tar.gz: 6c1fe701cada3c42cf79fad64c89bec28d976895e2cfdc38cc354aea430aabbd
3
+ metadata.gz: 7641f362f496605dc130ab2e58bade6d6d22f47224f132d5c963c3f6179ff51e
4
+ data.tar.gz: ee3cc24d4ecc115259754d441e2d351a9c0ca8d1490468ee993b14f8f8981967
5
5
  SHA512:
6
- metadata.gz: 7828f35bb04b7929d2d27af05149146d7812767724793850371115e163383b561a153b9ff9818954e998e44049d96f9e1bf6ba250351aa3b94e65ff75a4e226b
7
- data.tar.gz: 3265c6b0f4f5c9d0f8c72ac55013a7bedca3e4559822af63390642b90b8964d9e5fa334863fee7efa321b022602ae4d2c6e49d1bf2cdda98a330115f001984d4
6
+ metadata.gz: cce961a47f97df03f1819fa8ab1f601d15a7ab1f86091eca0e6faf663813314e461bb22e458c05ca63f2b21cb5940f3272de8dffcd1515c0d0d1346b0bd43c99
7
+ data.tar.gz: 57675264ab3fa96514c2330616b2e2f410e1e5fad091989fb2a062c51a126cbb4a06e7ebb77026b767c17bf54a90133ac348bd4faefdc91d0c356dcf5587ceeb
@@ -21,6 +21,7 @@ jobs:
21
21
  uses: ruby/setup-ruby@v1
22
22
  with:
23
23
  ruby-version: ${{ matrix.ruby }}
24
+ bundler-cache: true
24
25
  - name: Install dependencies
25
26
  run: bundle install --jobs 4 --retry 3
26
27
  - name: Run tests
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
@@ -2,6 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/ronin-rb/ronin-web-server/actions/workflows/ruby.yml/badge.svg)](https://github.com/ronin-rb/ronin-web-server/actions/workflows/ruby.yml)
4
4
  [![Code Climate](https://codeclimate.com/github/ronin-rb/ronin-web-server.svg)](https://codeclimate.com/github/ronin-rb/ronin-web-server)
5
+ [![Gem Version](https://badge.fury.io/rb/ronin-web-server.svg)](https://badge.fury.io/rb/ronin-web-server)
5
6
 
6
7
  * [Website](https://ronin-rb.dev/)
7
8
  * [Source](https://github.com/ronin-rb/ronin-web-server)
@@ -21,39 +22,67 @@ security research and development.
21
22
  * Provides a [Sinatra][sinatra] based
22
23
  {Ronin::Web::Server::Base web server base class}.
23
24
  * Supports additional routing helper methods:
24
- * `any` - matches any HTTP request method.
25
- * `default` - default response for the app.
26
- * `basic_auth` - enables Basic-Auth for the app.
27
- * `redirect` - adds a redirect to a given URL for the given path.
28
- * `file` - mounts a local file to the given path.
29
- * `directory` - mounts a local directory of files at the given path.
30
- * `public_dir` - mounts the files/directories within the directory to the root
31
- of the app.
32
- * `vhost` - routes all requests for the given host to another app.
33
- * `mount` - routes all requests for a given directory to another app.
25
+ * [any][docs-any] - matches any HTTP request method.
26
+ * [default][docs-default] - default response for the app.
27
+ * [basic_auth][docs-basic_auth] - enables Basic-Auth for the app.
28
+ * [redirect][docs-redirect] - adds a redirect to a given URL for the given
29
+ path.
30
+ * [file][docs-file] - mounts a local file to the given path.
31
+ * [directory][docs-directory] - mounts a local directory of files at the given
32
+ path.
33
+ * [public_dir][docs-public_dir] - mounts the files/directories within the
34
+ directory to the root of the app.
35
+ * [vhost][docs-vhost] - routes all requests for the given host to another app.
36
+ * [mount][docs-mount] - routes all requests for a given directory to another
37
+ app.
34
38
  * Supports additional routing conditions:
35
- * `client_ip` - matches the client IP Address that sent the request.
36
- * `asn` - matches the AS number of the client's IP address.
37
- * `country_code` - matches the country code of the ASN information for the
38
- client's IP address.
39
- * `asn_name` - matches the company/ISP name of the ASN information for the
40
- client's IP address.
41
- * `host` - matches the `Host` header.
42
- * `referer` - matches the `Referer` header of the request.
43
- * `user_agent` - matches the `User-Agent` header of the request.
44
- * `browser` - matches the browser name from the `User-Agent` header of the
39
+ * [client_ip][docs-client_ip] - matches the client IP Address that sent the
45
40
  request.
46
- * `browser_vendor` - matches the browser vendor from the `User-Agent` header
47
- of the request.
48
- * `browser_version` - matches the browser version from the `User-Agent` header
49
- of the request.
50
- * `device_type` - matches the device type of the `User-Agent` header of the
51
- request.
52
- * `os` - matches the OS from the `User-Agent` header of the request.
53
- * `os_version` - matches the OS version from the `User-Agent` header of the
41
+ * [asn][docs-asn] - matches the AS number of the client's IP address.
42
+ * [country_code][docs-country_code] - matches the country code of the ASN
43
+ information for the client's IP address.
44
+ * [asn_name][docs-asn_name] - matches the company/ISP name of the ASN
45
+ information for the client's IP address.
46
+ * [host][docs-host] - matches the `Host` header.
47
+ * [referer][docs-referer] - matches the `Referer` header of the request.
48
+ * [user_agent][docs-user_agent] - matches the `User-Agent` header of the
54
49
  request.
50
+ * [browser][docs-browser] - matches the browser name from the `User-Agent`
51
+ header of the request.
52
+ * [browser_vendor][docs-browser_vendor] - matches the browser vendor from the
53
+ `User-Agent` header of the request.
54
+ * [browser_version][docs-browser_version] - matches the browser version from
55
+ the `User-Agent` header of the request.
56
+ * [device_type][docs-device_type] - matches the device type of the
57
+ `User-Agent` header of the request.
58
+ * [os][docs-os] - matches the OS from the `User-Agent` header of the request.
59
+ * [os_version][docs-os_version] - matches the OS version from the `User-Agent`
60
+ header of the request.
55
61
  * Has 97% documentation coverage.
56
- * Has 85% test coverage.
62
+ * Has 90% test coverage.
63
+
64
+ [docs-any]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Routing/ClassMethods.html#any-instance_method
65
+ [docs-default]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Routing/ClassMethods.html#default-instance_method
66
+ [docs-basic_auth]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Routing/ClassMethods.html#basic_auth-instance_method
67
+ [docs-redirect]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Routing/ClassMethods.html#redirect-instance_method
68
+ [docs-file]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Routing/ClassMethods.html#file-instance_method
69
+ [docs-directory]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Routing/ClassMethods.html#directory-instance_method
70
+ [docs-public_dir]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Routing/ClassMethods.html#public_dir-instance_method
71
+ [docs-vhost]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Routing/ClassMethods.html#vhost-instance_method
72
+ [docs-mount]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Routing/ClassMethods.html#mount-instance_method
73
+ [docs-client_ip]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#client_ip-instance_method
74
+ [docs-asn]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#asn-instance_method
75
+ [docs-country_code]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#country_code-instance_method
76
+ [docs-asn_name]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#asn_name-instance_method
77
+ [docs-host]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#host-instance_method
78
+ [docs-referer]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#referer-instance_method
79
+ [docs-user_agent]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#user_agent-instance_method
80
+ [docs-browser]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#browser-instance_method
81
+ [docs-browser_vendor]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#browser_vendor-instance_method
82
+ [docs-browser_version]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#browser_version-instance_method
83
+ [docs-device_type]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#device_type-instance_method
84
+ [docs-os]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#os-instance_method
85
+ [docs-os_version]: https://ronin-rb.dev/docs/ronin-web-server/Ronin/Web/Server/Conditions/ClassMethods.html#os_version-instance_method
57
86
 
58
87
  ## Examples
59
88
 
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- require 'rubygems'
1
+ # frozen_string_literal: true
2
2
 
3
3
  begin
4
4
  require 'bundler'
data/gemspec.yml CHANGED
@@ -25,7 +25,7 @@ dependencies:
25
25
  rack-user_agent: ~> 0.5
26
26
  sinatra: ~> 3.0
27
27
  # Ronin dependencies:
28
- ronin-support: ~> 1.0.0.beta1
28
+ ronin-support: ~> 1.0
29
29
 
30
30
  development_dependencies:
31
31
  bundler: ~> 2.0
@@ -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.beta3'
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.beta3
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-01-14 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
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 1.0.0.beta1
75
+ version: '1.0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 1.0.0.beta1
82
+ version: '1.0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: bundler
85
85
  requirement: !ruby/object:Gem::Requirement