wovnrb 0.2.09 → 0.2.10
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/lib/wovnrb.rb +13 -11
- data/lib/wovnrb/services/glob.rb +25 -0
- data/lib/wovnrb/store.rb +57 -34
- data/lib/wovnrb/version.rb +1 -1
- data/test/lib/services/glob_test.rb +35 -0
- data/test/lib/store_test.rb +40 -0
- metadata +5 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fc2f6b32bbb1a1ae62581625150e7192a97e7536
|
|
4
|
+
data.tar.gz: 700ff16d073253ea5e761a1fbba50fa31db4d293
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c8081098e724536d3eaed17c9ba986f1d09a5fcfad40b59cc34393cac266f3dff2cddb42c9c383d334a8a8c60d884fa98304bdd76f18a81628e7e761269f27b2
|
|
7
|
+
data.tar.gz: 09747ebd43f2298e0e2daea26b77603bae9fd2bb43cf2334c20ef80d8fde8cb8d4f8ee8db801d74c8989a9828b1072461962ad8605af774c3e60c46670b45284
|
data/lib/wovnrb.rb
CHANGED
|
@@ -44,21 +44,23 @@ module Wovnrb
|
|
|
44
44
|
# pass to application
|
|
45
45
|
status, res_headers, body = @app.call(headers.request_out)
|
|
46
46
|
|
|
47
|
-
if res_headers["Content-Type"] =~ /html/
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
if res_headers["Content-Type"] =~ /html/
|
|
48
|
+
unless @store.settings['ignore_globs'].any?{|g| g.match?(headers.pathname)}
|
|
49
|
+
# ApiData creates request for external server, but cannot use async.
|
|
50
|
+
# Because some server not allow multi thread. (env['async.callback'] is not supported at all Server).
|
|
51
|
+
api_data = ApiData.new(headers.redis_url, @store)
|
|
52
|
+
values = api_data.get_data
|
|
53
|
+
url = {
|
|
53
54
|
:protocol => headers.protocol,
|
|
54
55
|
:host => headers.host,
|
|
55
56
|
:pathname => headers.pathname
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
}
|
|
58
|
+
body = switch_lang(body, values, url, lang, headers) unless status.to_s =~ /^1|302/
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
content_length = 0
|
|
61
|
+
body.each { |b| content_length += b.respond_to?(:bytesize) ? b.bytesize : 0 }
|
|
62
|
+
res_headers["Content-Length"] = content_length.to_s
|
|
63
|
+
end
|
|
62
64
|
end
|
|
63
65
|
|
|
64
66
|
headers.out(res_headers)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Wovnrb
|
|
2
|
+
# inspired by https://github.com/isaacs/node-glob
|
|
3
|
+
#
|
|
4
|
+
# "*" Matches 0 or more characters in a single path portion
|
|
5
|
+
# "**" If a "globstar" is alone in a path portion,
|
|
6
|
+
# then it matches zero or more directories and subdirectories searching for matches.
|
|
7
|
+
#
|
|
8
|
+
# @note "?" or other pattern is not implemented
|
|
9
|
+
class Glob
|
|
10
|
+
def initialize(pattern)
|
|
11
|
+
sub_directories = pattern.split('/**', -1)
|
|
12
|
+
regexp = sub_directories.map do |sub_dir|
|
|
13
|
+
sub_dir.split('*', -1)
|
|
14
|
+
.map {|p| Regexp.escape(p)}
|
|
15
|
+
.join('[^/]*')
|
|
16
|
+
end.join('(/[^/]*)*')
|
|
17
|
+
|
|
18
|
+
@regexp = Regexp.new("^#{regexp}$")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def match?(url)
|
|
22
|
+
!@regexp.match(url).nil?
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
data/lib/wovnrb/store.rb
CHANGED
|
@@ -3,6 +3,7 @@ require 'uri'
|
|
|
3
3
|
require 'cgi'
|
|
4
4
|
require 'singleton'
|
|
5
5
|
require 'wovnrb/services/wovn_logger'
|
|
6
|
+
require 'wovnrb/services/glob'
|
|
6
7
|
|
|
7
8
|
module Wovnrb
|
|
8
9
|
class Store
|
|
@@ -23,6 +24,8 @@ module Wovnrb
|
|
|
23
24
|
'user_token' => '',
|
|
24
25
|
'secret_key' => '',
|
|
25
26
|
'log_path' => 'log/wovn_error.log',
|
|
27
|
+
'ignore_paths' => [],
|
|
28
|
+
'ignore_globs' => [],
|
|
26
29
|
'url_pattern' => 'path',
|
|
27
30
|
'url_pattern_reg' => "/(?<lang>[^/.?]+)",
|
|
28
31
|
'query' => [],
|
|
@@ -48,19 +51,23 @@ module Wovnrb
|
|
|
48
51
|
errors = [];
|
|
49
52
|
if !settings.has_key?('user_token') || settings['user_token'].length < 5 || settings['user_token'].length > 6
|
|
50
53
|
valid = false
|
|
51
|
-
errors.push("User token #{settings['user_token']} is not valid.")
|
|
54
|
+
errors.push("User token #{settings['user_token']} is not valid.")
|
|
52
55
|
end
|
|
53
56
|
if !settings.has_key?('secret_key') || settings['secret_key'].length == 0 #|| settings['secret_key'].length < 5 || settings['secret_key'].length > 6
|
|
54
57
|
valid = false
|
|
55
|
-
errors.push("Secret key #{settings['secret_key']} is not valid.")
|
|
58
|
+
errors.push("Secret key #{settings['secret_key']} is not valid.")
|
|
59
|
+
end
|
|
60
|
+
if settings.has_key?('ignore_paths') && !settings['ignore_paths'].kind_of?(Array)
|
|
61
|
+
valid = false
|
|
62
|
+
errors.push("Ignore Paths #{settings['ignore_paths']} should be Array.")
|
|
56
63
|
end
|
|
57
64
|
if !settings.has_key?('url_pattern') || settings['url_pattern'].length == 0
|
|
58
65
|
valid = false
|
|
59
|
-
errors.push("Url pattern #{settings['url_pattern']} is not valid.")
|
|
66
|
+
errors.push("Url pattern #{settings['url_pattern']} is not valid.")
|
|
60
67
|
end
|
|
61
68
|
if !settings.has_key?('query') || !settings['query'].kind_of?(Array)
|
|
62
69
|
valid = false
|
|
63
|
-
errors.push("query config #{settings['query']} is not valid.")
|
|
70
|
+
errors.push("query config #{settings['query']} is not valid.")
|
|
64
71
|
end
|
|
65
72
|
if !settings.has_key?('api_url') || settings['api_url'].length == 0
|
|
66
73
|
valid = false
|
|
@@ -68,11 +75,11 @@ module Wovnrb
|
|
|
68
75
|
end
|
|
69
76
|
if !settings.has_key?('default_lang') || settings['default_lang'].length == 0
|
|
70
77
|
valid = false
|
|
71
|
-
errors.push("Default lang #{settings['default_lang']} is not valid.")
|
|
78
|
+
errors.push("Default lang #{settings['default_lang']} is not valid.")
|
|
72
79
|
end
|
|
73
80
|
if !settings.has_key?('supported_langs') || !settings['supported_langs'].kind_of?(Array) || settings['supported_langs'].size < 1
|
|
74
81
|
valid = false
|
|
75
|
-
errors.push("Supported langs configuration is not valid.")
|
|
82
|
+
errors.push("Supported langs configuration is not valid.")
|
|
76
83
|
end
|
|
77
84
|
# log errors
|
|
78
85
|
if errors.length > 0
|
|
@@ -92,41 +99,57 @@ module Wovnrb
|
|
|
92
99
|
@config_loaded = false
|
|
93
100
|
end
|
|
94
101
|
|
|
95
|
-
if
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
if @config_loaded
|
|
103
|
+
return @settings
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# get Rails config.wovnrb
|
|
107
|
+
if Object.const_defined?('Rails') && Rails.configuration.respond_to?(:wovnrb)
|
|
108
|
+
config_settings = Rails.configuration.wovnrb.stringify_keys
|
|
109
|
+
if config_settings.has_key?('url_pattern')
|
|
110
|
+
if config_settings['url_pattern'] == 'query' || config_settings['url_pattern'] == 'subdomain' || config_settings['url_pattern'] == 'path'
|
|
111
|
+
config_settings['url_pattern'] = config_settings['url_pattern']
|
|
112
|
+
config_settings.delete('url_pattern')
|
|
104
113
|
end
|
|
105
|
-
@settings.merge!(Rails.configuration.wovnrb.stringify_keys)
|
|
106
114
|
end
|
|
115
|
+
@settings.merge!(Rails.configuration.wovnrb.stringify_keys)
|
|
116
|
+
end
|
|
117
|
+
cleanSettings
|
|
107
118
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if @settings['url_pattern'] == 'path'
|
|
114
|
-
@settings['url_pattern_reg'] = "/(?<lang>[^/.?]+)"
|
|
115
|
-
elsif @settings['url_pattern'] == 'query'
|
|
116
|
-
@settings['url_pattern_reg'] = "((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)"
|
|
117
|
-
elsif @settings['url_pattern'] == 'subdomain'
|
|
118
|
-
@settings['url_pattern_reg'] = "^(?<lang>[^.]+)\."
|
|
119
|
-
end
|
|
120
|
-
if @settings['test_mode'] != true || @settings['test_mode'] != 'on'
|
|
121
|
-
@settings['test_mode'] = false
|
|
122
|
-
else
|
|
123
|
-
@settings['test_mode'] = true
|
|
124
|
-
end
|
|
119
|
+
# fix settings object
|
|
120
|
+
@settings['default_lang'] = Lang.get_code(@settings['default_lang'])
|
|
121
|
+
if !@settings.has_key?('supported_langs')
|
|
122
|
+
@settings['supported_langs'] = [@settings['default_lang']]
|
|
123
|
+
end
|
|
125
124
|
|
|
126
|
-
|
|
125
|
+
if @settings['url_pattern'] == 'path'
|
|
126
|
+
@settings['url_pattern_reg'] = "/(?<lang>[^/.?]+)"
|
|
127
|
+
elsif @settings['url_pattern'] == 'query'
|
|
128
|
+
@settings['url_pattern_reg'] = "((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)"
|
|
129
|
+
elsif @settings['url_pattern'] == 'subdomain'
|
|
130
|
+
@settings['url_pattern_reg'] = "^(?<lang>[^.]+)\."
|
|
127
131
|
end
|
|
132
|
+
|
|
133
|
+
if @settings['test_mode'] != true || @settings['test_mode'] != 'on'
|
|
134
|
+
@settings['test_mode'] = false
|
|
135
|
+
else
|
|
136
|
+
@settings['test_mode'] = true
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
if @settings['ignore_paths'].kind_of?(Array)
|
|
140
|
+
@settings['ignore_globs'] = @settings['ignore_paths'].map do |pattern|
|
|
141
|
+
Glob.new(pattern)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
@config_loaded = true
|
|
128
146
|
@settings
|
|
129
147
|
end
|
|
148
|
+
|
|
149
|
+
private
|
|
150
|
+
def cleanSettings
|
|
151
|
+
@settings['ignore_globs'] = []
|
|
152
|
+
end
|
|
130
153
|
end
|
|
131
154
|
|
|
132
155
|
end
|
data/lib/wovnrb/version.rb
CHANGED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'wovnrb/services/glob'
|
|
3
|
+
|
|
4
|
+
module Wovnrb
|
|
5
|
+
class GlobTest < WovnMiniTest
|
|
6
|
+
def test_match
|
|
7
|
+
assert_equal(false, Glob.new('api/*').match?('api'))
|
|
8
|
+
assert_equal(true, Glob.new('api/*').match?('api/'))
|
|
9
|
+
assert_equal(true, Glob.new('api/*').match?('api/a'))
|
|
10
|
+
assert_equal(false, Glob.new('api/*').match?('api/a/b'))
|
|
11
|
+
assert_equal(true, Glob.new('api/*.html').match?('api/a.html'))
|
|
12
|
+
assert_equal(false, Glob.new('api/*.html').match?('api/a/b.html'))
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_match_2_star
|
|
16
|
+
assert_equal(false, Glob.new('api/**/*').match?('api'))
|
|
17
|
+
assert_equal(true, Glob.new('api/**/*').match?('api/'))
|
|
18
|
+
assert_equal(true, Glob.new('api/**/*').match?('api/a'))
|
|
19
|
+
assert_equal(true, Glob.new('api/**/*').match?('api/a/b'))
|
|
20
|
+
assert_equal(true, Glob.new('api/**/*.html').match?('api/a.html'))
|
|
21
|
+
assert_equal(true, Glob.new('api/**/*.html').match?('api/a/b.html'))
|
|
22
|
+
assert_equal(false, Glob.new('api/**/*.html').match?('api/a/b'))
|
|
23
|
+
assert_equal(true, Glob.new('api/**').match?('api/a'))
|
|
24
|
+
assert_equal(true, Glob.new('api/**').match?('api/a/b.html'))
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_match_regex_injection
|
|
28
|
+
assert_equal(false, Glob.new('api/a?*').match?('api/a'))
|
|
29
|
+
assert_equal(true, Glob.new('api/a?*').match?('api/a?'))
|
|
30
|
+
assert_equal(true, Glob.new('api/a?*').match?('api/a?b'))
|
|
31
|
+
assert_equal(false, Glob.new('api/**?').match?('api/a'))
|
|
32
|
+
assert_equal(true, Glob.new('api/**?').match?('api/?'))
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
data/test/lib/store_test.rb
CHANGED
|
@@ -43,5 +43,45 @@ module Wovnrb
|
|
|
43
43
|
assert_equal(false, valid)
|
|
44
44
|
assert_equal(['User token is not valid.', 'Secret key is not valid.'], mock.errors)
|
|
45
45
|
end
|
|
46
|
+
|
|
47
|
+
def test_settings_ignore_paths
|
|
48
|
+
s = Wovnrb::Store.instance
|
|
49
|
+
s.settings({'ignore_paths' => ['/api/**']})
|
|
50
|
+
assert_equal(1, s.settings['ignore_globs'].size)
|
|
51
|
+
assert_equal(true, s.settings['ignore_globs'].first.match?('/api/a/b'))
|
|
52
|
+
assert_equal(false, s.settings['ignore_globs'].first.match?('/a/b'))
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_settings_ignore_paths_multiple
|
|
56
|
+
s = Wovnrb::Store.instance
|
|
57
|
+
s.settings({'ignore_paths' => ['/api/a/**', '/api/b/**']})
|
|
58
|
+
assert_equal(2, s.settings['ignore_globs'].size)
|
|
59
|
+
assert_equal(true, s.settings['ignore_globs'].any?{|g| g.match?('/api/a')})
|
|
60
|
+
assert_equal(true, s.settings['ignore_globs'].any?{|g| g.match?('/api/b')})
|
|
61
|
+
assert_equal(false, s.settings['ignore_globs'].any?{|g| g.match?('/api/c')})
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_settings_ignore_paths_empty
|
|
65
|
+
s = Wovnrb::Store.instance
|
|
66
|
+
s.settings({'ignore_paths' => []})
|
|
67
|
+
assert_equal([], s.settings['ignore_globs'])
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_settings_invalid_ignore_paths
|
|
71
|
+
mock = LogMock.mock_log
|
|
72
|
+
store = Wovnrb::Store.instance
|
|
73
|
+
store.settings({'ignore_paths' => 'aaaa'})
|
|
74
|
+
|
|
75
|
+
assert_equal(false, store.valid_settings?)
|
|
76
|
+
assert_equal(['User token is not valid.', 'Secret key is not valid.', 'Ignore Paths aaaa should be Array.'], mock.errors)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_settings_ignore_glob_injection
|
|
80
|
+
s = Wovnrb::Store.instance
|
|
81
|
+
s.settings({'ignore_paths' => nil})
|
|
82
|
+
s.settings({'ignore_globs' => [1, 2]})
|
|
83
|
+
|
|
84
|
+
assert_equal([], s.settings['ignore_globs'])
|
|
85
|
+
end
|
|
46
86
|
end
|
|
47
87
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: wovnrb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.10
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jeff Sandford
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2016-
|
|
12
|
+
date: 2016-10-11 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: nokogumbo
|
|
@@ -317,6 +317,7 @@ files:
|
|
|
317
317
|
- lib/wovnrb/html_replacers/text_replacer.rb
|
|
318
318
|
- lib/wovnrb/lang.rb
|
|
319
319
|
- lib/wovnrb/railtie.rb
|
|
320
|
+
- lib/wovnrb/services/glob.rb
|
|
320
321
|
- lib/wovnrb/services/url.rb
|
|
321
322
|
- lib/wovnrb/services/wovn_logger.rb
|
|
322
323
|
- lib/wovnrb/store.rb
|
|
@@ -334,6 +335,7 @@ files:
|
|
|
334
335
|
- test/lib/html_replacers/script_replacer_test.rb
|
|
335
336
|
- test/lib/html_replacers/text_replacer_test.rb
|
|
336
337
|
- test/lib/lang_test.rb
|
|
338
|
+
- test/lib/services/glob_test.rb
|
|
337
339
|
- test/lib/services/url_test.rb
|
|
338
340
|
- test/lib/services/wovn_logger_test.rb
|
|
339
341
|
- test/lib/store_test.rb
|
|
@@ -380,6 +382,7 @@ test_files:
|
|
|
380
382
|
- test/lib/html_replacers/script_replacer_test.rb
|
|
381
383
|
- test/lib/html_replacers/text_replacer_test.rb
|
|
382
384
|
- test/lib/lang_test.rb
|
|
385
|
+
- test/lib/services/glob_test.rb
|
|
383
386
|
- test/lib/services/url_test.rb
|
|
384
387
|
- test/lib/services/wovn_logger_test.rb
|
|
385
388
|
- test/lib/store_test.rb
|