sprockets 3.0.0.beta.2 → 3.0.0.beta.3
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 +4 -4
- data/README.md +4 -0
- data/lib/sprockets/asset.rb +1 -1
- data/lib/sprockets/asset_uri.rb +9 -4
- data/lib/sprockets/base.rb +3 -1
- data/lib/sprockets/digest_utils.rb +3 -0
- data/lib/sprockets/mime.rb +18 -7
- data/lib/sprockets/path_utils.rb +12 -3
- data/lib/sprockets/resolve.rb +2 -1
- data/lib/sprockets/server.rb +7 -7
- data/lib/sprockets/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d80e59406f8e4f42c73b61fc3aa9a8e7b6cd6b37
|
4
|
+
data.tar.gz: fb62b74a69585406a2a5b0628d668ca5e2d50467
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b1ba31c1909eba6bb44ad66959b731cd1cef3b8d3c6775ba522da5bf0b825407c0c74587aa8810fffb1df34ec2e696def2990b48e0dcfae4ffac9dfd6270ea7
|
7
|
+
data.tar.gz: a4d49277f457e15d2f9562654a7dcd9e9cda745d867f36446f3a649bafda9d2f017ba05c0e30acadbb5f6006c7f97990dbeb8b613eb33b8f6a6333723aa8d97b
|
data/README.md
CHANGED
@@ -399,6 +399,10 @@ submit a pull request.
|
|
399
399
|
* Rename Asset#digest to Asset#hexdigest. Asset#digest is deprecated and will
|
400
400
|
return a raw byte String in 4.x.
|
401
401
|
|
402
|
+
**2.12.3** (October 28, 2014)
|
403
|
+
|
404
|
+
* Security: Fix directory traversal bug in development mode server.
|
405
|
+
|
402
406
|
**2.12.2** (September 5, 2014)
|
403
407
|
|
404
408
|
* Ensure internal asset lookups calls are still restricted to load paths within
|
data/lib/sprockets/asset.rb
CHANGED
data/lib/sprockets/asset_uri.rb
CHANGED
@@ -14,16 +14,21 @@ module Sprockets
|
|
14
14
|
#
|
15
15
|
# Returns String path and Hash of symbolized parameters.
|
16
16
|
def self.parse(str)
|
17
|
-
|
17
|
+
scheme, _, host, port, _, path, _, query, _ = URI.split(str)
|
18
18
|
|
19
|
-
unless
|
19
|
+
unless scheme == 'file'
|
20
20
|
raise URI::InvalidURIError, "expected file:// scheme: #{str}"
|
21
21
|
end
|
22
22
|
|
23
|
-
path = URI::Generic::DEFAULT_PARSER.unescape(
|
23
|
+
path = URI::Generic::DEFAULT_PARSER.unescape(path)
|
24
24
|
path.force_encoding(Encoding::UTF_8)
|
25
25
|
|
26
|
-
|
26
|
+
# Hack for parsing Windows "file://C:/Users/IEUser" paths
|
27
|
+
if host && port == ""
|
28
|
+
path = "#{host}:#{path}"
|
29
|
+
end
|
30
|
+
|
31
|
+
params = query.to_s.split('&').reduce({}) do |h, p|
|
27
32
|
k, v = p.split('=', 2)
|
28
33
|
h.merge(k.to_sym => v || true)
|
29
34
|
end
|
data/lib/sprockets/base.rb
CHANGED
@@ -176,7 +176,9 @@ module Sprockets
|
|
176
176
|
processors = bundled_processors.any? ? bundled_processors : processed_processors
|
177
177
|
processors += unwrap_encoding_processors(params[:encoding])
|
178
178
|
|
179
|
-
if
|
179
|
+
# Read into memory and process if theres a processor pipeline or the
|
180
|
+
# content type is text.
|
181
|
+
if processors.any? || mime_type_charset_detecter(type)
|
180
182
|
asset.merge!(process(
|
181
183
|
[method(:read_input)] + processors,
|
182
184
|
asset[:uri],
|
data/lib/sprockets/mime.rb
CHANGED
@@ -64,6 +64,19 @@ module Sprockets
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
+
# Internal: Get detecter function for MIME type.
|
68
|
+
#
|
69
|
+
# mime_type - String MIME type
|
70
|
+
#
|
71
|
+
# Returns Proc detector or nil if none is available.
|
72
|
+
def mime_type_charset_detecter(mime_type)
|
73
|
+
if type = mime_types[mime_type]
|
74
|
+
if detect = type[:charset]
|
75
|
+
return detect
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
67
80
|
# Public: Read file on disk with MIME type specific encoding.
|
68
81
|
#
|
69
82
|
# filename - String path
|
@@ -72,15 +85,13 @@ module Sprockets
|
|
72
85
|
# Returns String file contents transcoded to UTF-8 or in its external
|
73
86
|
# encoding.
|
74
87
|
def read_file(filename, content_type = nil)
|
75
|
-
data = File.
|
88
|
+
data = File.binread(filename)
|
76
89
|
|
77
|
-
if
|
78
|
-
|
79
|
-
|
80
|
-
|
90
|
+
if detect = mime_type_charset_detecter(content_type)
|
91
|
+
detect.call(data).encode(Encoding::UTF_8, :universal_newline => true)
|
92
|
+
else
|
93
|
+
data
|
81
94
|
end
|
82
|
-
|
83
|
-
data
|
84
95
|
end
|
85
96
|
|
86
97
|
# Public: Mapping of supported HTTP Content/Transfer encodings
|
data/lib/sprockets/path_utils.rb
CHANGED
@@ -42,7 +42,7 @@ module Sprockets
|
|
42
42
|
# Returns an empty `Array` if the directory does not exist.
|
43
43
|
def entries(path)
|
44
44
|
if File.directory?(path)
|
45
|
-
Dir.entries(path).reject { |entry| entry =~ /^\.|~$|^\#.*\#$/ }.sort
|
45
|
+
Dir.entries(path, :encoding => Encoding.default_internal).reject { |entry| entry =~ /^\.|~$|^\#.*\#$/ }.sort
|
46
46
|
else
|
47
47
|
[]
|
48
48
|
end
|
@@ -54,9 +54,12 @@ module Sprockets
|
|
54
54
|
#
|
55
55
|
# Returns true if path is absolute, otherwise false.
|
56
56
|
if File::ALT_SEPARATOR
|
57
|
+
require 'pathname'
|
58
|
+
|
57
59
|
# On Windows, ALT_SEPARATOR is \
|
60
|
+
# Delegate to Pathname nice the logic gets complex.
|
58
61
|
def absolute_path?(path)
|
59
|
-
path
|
62
|
+
Pathname.new(path).absolute?
|
60
63
|
end
|
61
64
|
else
|
62
65
|
def absolute_path?(path)
|
@@ -64,6 +67,12 @@ module Sprockets
|
|
64
67
|
end
|
65
68
|
end
|
66
69
|
|
70
|
+
if File::ALT_SEPARATOR
|
71
|
+
SEPARATOR_PATTERN = "#{Regexp.quote(File::SEPARATOR)}|#{Regexp.quote(File::ALT_SEPARATOR)}"
|
72
|
+
else
|
73
|
+
SEPARATOR_PATTERN = "#{Regexp.quote(File::SEPARATOR)}"
|
74
|
+
end
|
75
|
+
|
67
76
|
# Internal: Check if path is explicitly relative.
|
68
77
|
# Starts with "./" or "../".
|
69
78
|
#
|
@@ -71,7 +80,7 @@ module Sprockets
|
|
71
80
|
#
|
72
81
|
# Returns true if path is relative, otherwise false.
|
73
82
|
def relative_path?(path)
|
74
|
-
path =~ /^\.\.?(
|
83
|
+
path =~ /^\.\.?($|#{SEPARATOR_PATTERN})/ ? true : false
|
75
84
|
end
|
76
85
|
|
77
86
|
# Internal: Get relative path for root path and subpath.
|
data/lib/sprockets/resolve.rb
CHANGED
@@ -110,7 +110,8 @@ module Sprockets
|
|
110
110
|
|
111
111
|
if absolute_path?(path)
|
112
112
|
path = File.expand_path(path)
|
113
|
-
if
|
113
|
+
if paths_split(self.paths, path) && file?(path) &&
|
114
|
+
(accept.nil? || resolve_path_transform_type(path, accept))
|
114
115
|
filename = path
|
115
116
|
type = resolve_path_transform_type(path, accept)
|
116
117
|
end
|
data/lib/sprockets/server.rb
CHANGED
@@ -32,16 +32,16 @@ module Sprockets
|
|
32
32
|
# Extract the path from everything after the leading slash
|
33
33
|
path = Rack::Utils.unescape(env['PATH_INFO'].to_s.sub(/^\//, ''))
|
34
34
|
|
35
|
-
# URLs containing a `".."` are rejected for security reasons.
|
36
|
-
if forbidden_request?(path)
|
37
|
-
return forbidden_response
|
38
|
-
end
|
39
|
-
|
40
35
|
# Strip fingerprint
|
41
36
|
if fingerprint = path_fingerprint(path)
|
42
37
|
path = path.sub("-#{fingerprint}", '')
|
43
38
|
end
|
44
39
|
|
40
|
+
# URLs containing a `".."` are rejected for security reasons.
|
41
|
+
if forbidden_request?(path)
|
42
|
+
return forbidden_response
|
43
|
+
end
|
44
|
+
|
45
45
|
# Look up the asset.
|
46
46
|
options = {}
|
47
47
|
options[:bundle] = !body_only?(env)
|
@@ -115,7 +115,7 @@ module Sprockets
|
|
115
115
|
#
|
116
116
|
# http://example.org/assets/../../../etc/passwd
|
117
117
|
#
|
118
|
-
path.include?("..")
|
118
|
+
path.include?("..") || absolute_path?(path)
|
119
119
|
end
|
120
120
|
|
121
121
|
# Returns a 200 OK response tuple
|
@@ -271,7 +271,7 @@ module Sprockets
|
|
271
271
|
# # => "0aa2105d29558f3eb790d411d7d8fb66"
|
272
272
|
#
|
273
273
|
def path_fingerprint(path)
|
274
|
-
path[/-([0-9a-f]{7,128})\.[^.]
|
274
|
+
path[/-([0-9a-f]{7,128})\.[^.]+\z/, 1]
|
275
275
|
end
|
276
276
|
end
|
277
277
|
end
|
data/lib/sprockets/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sprockets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.beta.
|
4
|
+
version: 3.0.0.beta.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Stephenson
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-10-
|
12
|
+
date: 2014-10-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|