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 +4 -4
- data/.github/workflows/ruby.yml +1 -0
- data/.rubocop.yml +5 -145
- data/ChangeLog.md +8 -1
- data/Gemfile +7 -4
- data/README.md +58 -29
- data/Rakefile +1 -1
- data/gemspec.yml +1 -1
- data/lib/ronin/web/server/base.rb +8 -8
- data/lib/ronin/web/server/conditions.rb +2 -2
- data/lib/ronin/web/server/helpers.rb +0 -1
- data/lib/ronin/web/server/request.rb +1 -0
- data/lib/ronin/web/server/reverse_proxy.rb +11 -10
- data/lib/ronin/web/server/routing.rb +15 -12
- data/lib/ronin/web/server/version.rb +1 -1
- data/lib/ronin/web/server.rb +5 -0
- data/ronin-web-server.gemspec +4 -2
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7641f362f496605dc130ab2e58bade6d6d22f47224f132d5c963c3f6179ff51e
|
4
|
+
data.tar.gz: ee3cc24d4ecc115259754d441e2d351a9c0ca8d1490468ee993b14f8f8981967
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cce961a47f97df03f1819fa8ab1f601d15a7ab1f86091eca0e6faf663813314e461bb22e458c05ca63f2b21cb5940f3272de8dffcd1515c0d0d1346b0bd43c99
|
7
|
+
data.tar.gz: 57675264ab3fa96514c2330616b2e2f410e1e5fad091989fb2a062c51a126cbb4a06e7ebb77026b767c17bf54a90133ac348bd4faefdc91d0c356dcf5587ceeb
|
data/.github/workflows/ruby.yml
CHANGED
data/.rubocop.yml
CHANGED
@@ -3,152 +3,12 @@ AllCops:
|
|
3
3
|
SuggestExtensions: false
|
4
4
|
TargetRubyVersion: 3.1
|
5
5
|
|
6
|
-
|
7
|
-
|
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
|
-
|
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
|
14
|
+
- 'lib/ronin/web/server/conditions.rb'
|
data/ChangeLog.md
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
-
### 0.1.
|
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',
|
32
|
-
gem 'sord',
|
33
|
-
gem 'stackprof',
|
34
|
-
gem 'rubocop',
|
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
|
-
*
|
25
|
-
*
|
26
|
-
*
|
27
|
-
*
|
28
|
-
|
29
|
-
*
|
30
|
-
*
|
31
|
-
|
32
|
-
*
|
33
|
-
|
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
|
-
*
|
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
|
-
*
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
*
|
53
|
-
*
|
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
|
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
data/gemspec.yml
CHANGED
@@ -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 :
|
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
|
@@ -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
|
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
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
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 &&
|
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]
|
148
|
+
# @param [String, Regexp] path
|
149
149
|
# The path the web server will host the file at.
|
150
150
|
#
|
151
|
-
# @param [String]
|
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(
|
163
|
-
get(
|
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]
|
169
|
+
# @param [String] path
|
170
170
|
# The path the web server will host the directory at.
|
171
171
|
#
|
172
|
-
# @param [String]
|
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(
|
184
|
-
|
183
|
+
def directory(path,local_dir,conditions={})
|
184
|
+
path = path.chomp('/')
|
185
|
+
dir = Rack::File.new(local_dir)
|
185
186
|
|
186
|
-
get("#{
|
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
|
data/lib/ronin/web/server.rb
CHANGED
data/ronin-web-server.gemspec
CHANGED
@@ -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 =
|
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 =
|
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.
|
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-
|
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
|
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
|
82
|
+
version: '1.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|