rucaptcha 1.1.2 → 1.1.4
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/CHANGELOG.md +5 -0
- data/lib/rucaptcha/captcha.rb +62 -41
- data/lib/rucaptcha/engine.rb +7 -2
- data/lib/rucaptcha/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: 7b416a66df71165fcd0c026e7aafbb858e1b3e39
|
4
|
+
data.tar.gz: e796e5f306d7b8a4f73bf46cf598257761caae9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c69ac42919fd8cdfe783f570efcbb682296e4394c1e61a9ffb211abf14796eed889d0fa0b6fbb8ee58c759af9036bb93add63c1e33c418267c4139a57b107d5
|
7
|
+
data.tar.gz: b60ee18e344f4ab2bc31ea6cef1e7cdbc5f69092ef93ccd860c1178e65624ed301e1e927f14ed6e0e07fd1b46f0ce4f78b6acc601558c0d772d5b8f493f6cc8e
|
data/CHANGELOG.md
CHANGED
data/lib/rucaptcha/captcha.rb
CHANGED
@@ -3,6 +3,7 @@ require 'open3'
|
|
3
3
|
module RuCaptcha
|
4
4
|
class Captcha
|
5
5
|
class << self
|
6
|
+
# Genrate ranom RGB color
|
6
7
|
def random_color
|
7
8
|
if RuCaptcha.config.style == :colorful
|
8
9
|
color1 = rand(56) + 15
|
@@ -16,83 +17,103 @@ module RuCaptcha
|
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
20
|
+
# Genrate random Captcha code
|
19
21
|
def random_chars
|
20
22
|
chars = SecureRandom.hex(RuCaptcha.config.len / 2).downcase
|
21
23
|
chars.gsub!(/[0ol1]/i, (rand(8) + 2).to_s)
|
22
24
|
chars
|
23
25
|
end
|
24
26
|
|
25
|
-
def rand_line_top(text_top, font_size)
|
26
|
-
text_top + rand(font_size * 0.7).to_i
|
27
|
-
end
|
28
|
-
|
29
27
|
# Create Captcha image by code
|
30
28
|
def create(code)
|
31
29
|
chars = code.split('')
|
32
|
-
|
33
|
-
|
34
|
-
full_height = font_size
|
35
|
-
full_width = font_size * chars.size
|
30
|
+
full_width = RuCaptcha.config.font_size * chars.size
|
31
|
+
full_height = RuCaptcha.config.font_size
|
36
32
|
size = "#{full_width}x#{full_height}"
|
33
|
+
|
34
|
+
return convert_for_windows(size, code) if Gem.win_platform?
|
35
|
+
|
36
|
+
opts = command_line_opts(chars, full_width)
|
37
|
+
convert(size, opts)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def command_line_opts(chars, full_width)
|
43
|
+
font_size = RuCaptcha.config.font_size
|
44
|
+
all_left = 20
|
37
45
|
half_width = full_width / 2
|
38
46
|
text_top = 0
|
39
47
|
text_left = 0 - (font_size * 0.28).to_i
|
40
|
-
stroke_width = (font_size * 0.05).to_i + 1
|
41
48
|
text_width = font_size + text_left
|
42
|
-
text_opts = []
|
43
|
-
line_opts = []
|
44
49
|
|
45
|
-
|
46
|
-
|
47
|
-
color = random_color
|
48
|
-
if i > 0
|
49
|
-
preview_color = rgbs[i - 1]
|
50
|
-
# Avoid color same as preview color
|
51
|
-
if color.index(color.min) == preview_color.index(preview_color.min) &&
|
52
|
-
color.index(color.max) == preview_color.index(preview_color.max)
|
53
|
-
# adjust RGB order
|
54
|
-
color = [color[1], color[2], color[0]]
|
55
|
-
end
|
56
|
-
end
|
57
|
-
rgbs << color
|
58
|
-
end
|
50
|
+
opts = { text: [], line: [] }
|
51
|
+
rgbs = uniq_rgbs_for_each_chars(chars)
|
59
52
|
|
60
53
|
chars.each_with_index do |char, i|
|
61
54
|
rgb = RuCaptcha.config.style == :colorful ? rgbs[i] : rgbs[0]
|
62
55
|
text_color = "rgba(#{rgb.join(',')}, 1)"
|
63
56
|
line_color = "rgba(#{rgb.join(',')}, 0.6)"
|
64
|
-
|
57
|
+
opts[:text] << %(-fill '#{text_color}' -draw 'text #{(text_left + text_width) * i + all_left},#{text_top} "#{char}"')
|
58
|
+
|
65
59
|
left_y = rand_line_top(text_top, font_size)
|
66
60
|
right_x = half_width + (half_width * 0.3).to_i
|
67
61
|
right_y = rand_line_top(text_top, font_size)
|
68
|
-
|
62
|
+
opts[:line] << %(-draw 'stroke #{line_color} line #{rand(10)},#{left_y} #{right_x},#{right_y}')
|
69
63
|
end
|
64
|
+
opts
|
65
|
+
end
|
70
66
|
|
67
|
+
def convert(size, opts)
|
68
|
+
stroke_width = (RuCaptcha.config.font_size * 0.05).to_i + 1
|
71
69
|
command = <<-CODE
|
72
70
|
convert -size #{size} \
|
73
71
|
-strokewidth #{stroke_width} \
|
74
|
-
#{
|
75
|
-
-pointsize #{font_size} -weight 500 \
|
76
|
-
#{
|
72
|
+
#{opts[:line].join(' ')} \
|
73
|
+
-pointsize #{RuCaptcha.config.font_size} -weight 500 \
|
74
|
+
#{opts[:text].join(' ')} \
|
77
75
|
-wave #{rand(2) + 3}x#{rand(2) + 1} \
|
78
76
|
-rotate #{rand(10) - 5} \
|
79
77
|
-gravity NorthWest -sketch 1x10+#{rand(2)} \
|
80
78
|
-fill none \
|
81
79
|
-implode #{RuCaptcha.config.implode} -trim label:- png:-
|
82
80
|
CODE
|
81
|
+
command.strip!
|
82
|
+
out, err, _st = Open3.capture3(command)
|
83
|
+
warn " RuCaptcha #{err.strip}" if err.present?
|
84
|
+
out
|
85
|
+
end
|
83
86
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
87
|
+
# Generate a simple captcha image for Windows Platform
|
88
|
+
def convert_for_windows(size, code)
|
89
|
+
png_file_path = Rails.root.join('tmp', 'cache', "#{code}.png")
|
90
|
+
command = "convert -size #{size} xc:White -gravity Center -weight 12 -pointsize 20 -annotate 0 \"#{code}\" -trim #{png_file_path}"
|
91
|
+
_out, err, _st = Open3.capture3(command)
|
92
|
+
warn " RuCaptcha #{err.strip}" if err.present?
|
93
|
+
png_file_path
|
94
|
+
end
|
95
|
+
|
96
|
+
# Geneate a uniq rgba colors for each chars
|
97
|
+
def uniq_rgbs_for_each_chars(chars)
|
98
|
+
rgbs = []
|
99
|
+
chars.count.times do |i|
|
100
|
+
color = random_color
|
101
|
+
if i > 0
|
102
|
+
preview_color = rgbs[i - 1]
|
103
|
+
# Avoid color same as preview color
|
104
|
+
if color.index(color.min) == preview_color.index(preview_color.min) &&
|
105
|
+
color.index(color.max) == preview_color.index(preview_color.max)
|
106
|
+
# adjust RGB order
|
107
|
+
color = [color[1], color[2], color[0]]
|
108
|
+
end
|
109
|
+
end
|
110
|
+
rgbs << color
|
95
111
|
end
|
112
|
+
rgbs
|
113
|
+
end
|
114
|
+
|
115
|
+
def rand_line_top(text_top, font_size)
|
116
|
+
text_top + rand(font_size * 0.7).to_i
|
96
117
|
end
|
97
118
|
|
98
119
|
def warn(msg)
|
data/lib/rucaptcha/engine.rb
CHANGED
@@ -11,16 +11,21 @@ module RuCaptcha
|
|
11
11
|
cache_store = RuCaptcha.config.cache_store
|
12
12
|
store_name = cache_store.is_a?(Array) ? cache_store.first : cache_store
|
13
13
|
if [:memory_store, :null_store, :file_store].include?(store_name)
|
14
|
-
|
14
|
+
msg = "
|
15
15
|
|
16
16
|
RuCaptcha's cache_store requirements are stored across processes and machines,
|
17
17
|
such as :mem_cache_store, :redis_store, or other distributed storage.
|
18
18
|
But your current set is :#{store_name}.
|
19
19
|
|
20
20
|
Please make config file `config/initializes/rucaptcha.rb` to setup `cache_store`.
|
21
|
-
More infomation please read GitHub
|
21
|
+
More infomation please read GitHub RuCaptcha README file.
|
22
22
|
|
23
23
|
"
|
24
|
+
if store_name == :null_store
|
25
|
+
raise msg
|
26
|
+
else
|
27
|
+
puts msg
|
28
|
+
end
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
data/lib/rucaptcha/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rucaptcha
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Lee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|