gems-status 0.63.0 → 0.64.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,29 +11,51 @@ module GemsStatus
11
11
  puts "---"
12
12
  end
13
13
 
14
- def print_results(results, checker_results, comments)
14
+
15
+ def print_results(gem_list, checker_results, comments)
16
+ print_gem_list(gem_list)
17
+ print_gem_comments(gem_list, comments)
18
+ print_gem_checker_results(checker_results)
19
+ end
20
+
21
+ def print_head
22
+ end
23
+
24
+ def print_tail
25
+ puts "---"
26
+ date = Time.now.strftime('%a %b %d %H:%M:%S %Z %Y')
27
+ puts "run by https://github.com/jordimassaguerpla/gems-status"
28
+ puts "#{date} - version: #{GemsStatus::VERSION}"
29
+ end
30
+
31
+ private
32
+
33
+ def print_gem_list(gem_list)
15
34
  puts "Gem list"
16
35
  puts ""
17
- results.each do |result|
18
- result.sort.each do |_, gem|
19
- puts "#{gem.name} #{gem.version} #{gem.license}"
20
- end
36
+ gem_list.sort.each do |_, gem|
37
+ puts "#{gem.name} #{gem.version} #{gem.license}"
21
38
  end
22
39
  puts ""
23
40
  puts "---"
41
+ end
42
+
43
+ def print_gem_comments(gem_list, comments)
24
44
  puts "Comments"
25
45
  puts ""
26
- results.each do |result|
27
- result.sort.each do |_, gem|
28
- if comments[gem.name]
29
- puts "#{gem.name}:"
30
- puts "#{comments[gem.name]}"
31
- puts ""
32
- end
46
+ gem_list.sort.each do |_, gem|
47
+ if comments[gem.name]
48
+ puts "#{gem.name}:"
49
+ puts "#{comments[gem.name]}"
50
+ puts ""
33
51
  end
34
52
  end
35
53
  puts ""
36
54
  puts "---"
55
+ end
56
+
57
+
58
+ def print_gem_checker_results(checker_results)
37
59
  if checker_results.length == 0
38
60
  puts "Checker results: SUCCESS"
39
61
  else
@@ -42,22 +64,12 @@ module GemsStatus
42
64
  puts ""
43
65
  checker_results.sort.each do |gem_name, checker_r|
44
66
  puts "#{gem_name}"
45
- checker_r.each do |_, checker|
67
+ checker_r.each do |checker|
46
68
  puts "#{checker.description}"
47
69
  end
48
70
  puts ""
49
71
  end
50
72
  end
51
73
 
52
- def print_head
53
- end
54
-
55
- def print_tail
56
- puts "---"
57
- date = Time.now.strftime('%a %b %d %H:%M:%S %Z %Y')
58
- puts "run by https://github.com/jordimassaguerpla/gems-status"
59
- puts "#{date} - version: #{GemsStatus::VERSION}"
60
- end
61
-
62
74
  end
63
75
  end
@@ -1,5 +1,7 @@
1
1
  require "openssl"
2
2
  OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
3
+ require "gmail"
4
+ require "rubygems/format"
3
5
 
4
6
  module GemsStatus
5
7
  class Mail
@@ -161,6 +163,34 @@ module GemsStatus
161
163
  return license
162
164
  end
163
165
 
166
+ def Utils.send_email(email_receiver, email_username, email_password, name, mssg)
167
+ Gmail.new(email_username, email_password) do |gmail|
168
+ gmail.deliver do
169
+ to email_receiver
170
+ subject "[gems-status] security alerts for #{name}"
171
+ text_part do
172
+ body mssg
173
+ end
174
+ end
175
+ end
176
+ end
177
+
178
+ def Utils.download_date(name, version)
179
+ Utils::log_debug "looking for date for #{name} - #{version}"
180
+ begin
181
+ versions = JSON.parse(open("https://rubygems.org/api/v1/versions/#{name}.json").read)
182
+ versions.each do |version|
183
+ if Gem::Version.new(version["number"]) == version
184
+ Utils::log_debug "Date for #{name} - #{version} : #{version["built_at"]}"
185
+ return Time.parse version["built_at"]
186
+ end
187
+ end
188
+ rescue
189
+ Utils::log_error(name, "There was a problem opening https://rubygems.org/api/v1/versions/#{name}.json")
190
+ end
191
+ nil
192
+ end
193
+
164
194
  private
165
195
 
166
196
  def Utils.download_gem(name, version, gems_url)
@@ -0,0 +1,48 @@
1
+ require './test/test-helper.rb'
2
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
3
+ require 'test/unit'
4
+ require 'gems-status'
5
+
6
+ module GemsStatus
7
+ class Utils
8
+ def self.download_md5(name, version, gems_url)
9
+ "12345"
10
+ end
11
+ def self.download_license(name, version, gems_url)
12
+ "license"
13
+ end
14
+ def self.download_date(name, version)
15
+ Time.parse "2012/03/01"
16
+ end
17
+ end
18
+ class GemSimpleTest < Test::Unit::TestCase
19
+ def test_from_git
20
+ gs = GemSimple.new("name", "version", "md5", "origin")
21
+ assert !gs.from_git?
22
+ gs = GemSimple.new("name", "version", "md5", "origin", "git://blalba")
23
+ assert gs.from_git?
24
+ end
25
+
26
+ def test_license
27
+ gs = GemSimple.new("name", "version", "md5", "origin")
28
+ assert_equal gs.license, "license"
29
+ gs = GemSimple.new("name", "version", "md5", "origin", "git://blalba")
30
+ assert_equal gs.license, nil
31
+ end
32
+
33
+ def test_md5
34
+ gs = GemSimple.new("name", "version", "md5", "origin")
35
+ assert_equal gs.md5, "12345"
36
+ gs = GemSimple.new("name", "version", "md5", "origin", "git://blalba")
37
+ assert_equal gs.md5, nil
38
+ end
39
+
40
+ def test_date
41
+ gs = GemSimple.new("name", "version", "md5", "origin")
42
+ assert_equal gs.date, Time.parse("2012/03/01")
43
+ gs = GemSimple.new("name", "version", "md5", "origin", "git://blalba")
44
+ assert_equal gs.date, Time.parse("2012/03/01")
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,17 @@
1
+ require './test/test-helper.rb'
2
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
3
+ require 'test/unit'
4
+ require 'gems-status'
5
+
6
+ module GemsStatus
7
+ class GemTest
8
+ attr_accessor :license
9
+ end
10
+ class HasALicenseTest < Test::Unit::TestCase
11
+ def test_check
12
+ gem = GemTest.new
13
+ gem.license = "something"
14
+ assert GemsStatus::HasALicense.new(nil).check?(gem)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ require './test/test-helper.rb'
2
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
3
+ require 'test/unit'
4
+ require 'gems-status'
5
+
6
+ module GemsStatus
7
+ class GemTest
8
+ attr_accessor :license
9
+ end
10
+ class IsNotGplTest < Test::Unit::TestCase
11
+ def test_check
12
+ gem = GemTest.new
13
+ gem.license = "something"
14
+ assert GemsStatus::IsNotGpl.new(nil).check?(gem)
15
+ gem.license = "GPL"
16
+ assert !GemsStatus::IsNotGpl.new(nil).check?(gem)
17
+ gem.license = "GPLv2"
18
+ assert !GemsStatus::IsNotGpl.new(nil).check?(gem)
19
+ gem.license = "GPLblabla "
20
+ assert !GemsStatus::IsNotGpl.new(nil).check?(gem)
21
+ end
22
+
23
+ def test_when_there_is_no_license
24
+ gem = GemTest.new
25
+ assert GemsStatus::IsNotGpl.new(nil).check?(gem)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,34 @@
1
+
2
+ require './test/test-helper.rb'
3
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
4
+ require 'test/unit'
5
+ require 'gems-status'
6
+
7
+ module GemsStatus
8
+ class Utils
9
+ def self.download_md5(name, version, gems_url)
10
+ "12345"
11
+ end
12
+ def self.download_license(name, version, gems_url)
13
+ "license"
14
+ end
15
+ def self.download_date(name, version)
16
+ Time.parse "2012/03/01"
17
+ end
18
+ end
19
+ class IsRubygemsTest < Test::Unit::TestCase
20
+ def test_check
21
+ ch = IsRubygems.new([])
22
+ gem = GemSimple.new("name", "version", "md5", "origin")
23
+ def gem.md5
24
+ return "12345"
25
+ end
26
+ assert ch.check?(gem)
27
+ gem = GemSimple.new("name", "version", "md5", "origin")
28
+ def gem.md5
29
+ return "_"
30
+ end
31
+ assert !ch.check?(gem)
32
+ end
33
+ end
34
+ end
@@ -13,36 +13,43 @@ module GemsStatus
13
13
  puts "DEBUG: dir : #{dir} #{dir.class.name}"
14
14
  @filename = "#{dir}/Gemfile.lock.test"
15
15
  @gems_url = ""
16
- @result = {}
17
16
  end
18
17
  end
19
18
 
20
19
  class TestLockfileGems < Test::Unit::TestCase
21
20
  def test_get_rubygems_names
22
21
  lockfilegems = LockfileGemsTest.new
23
- lockfilegems.execute
24
- assert(lockfilegems.result.length == 6)
25
- result = lockfilegems.result["test"].name
22
+ gem_list = lockfilegems.gem_list
23
+ assert(gem_list.length == 6)
24
+ result = gem_list["test"].name
26
25
  assert_equal("test",result)
27
- result = lockfilegems.result["test"].version
26
+ result = gem_list["test"].version
28
27
  assert_equal(Gem::Version.new("0.8.6"), result)
29
- result = lockfilegems.result["test2"].name
28
+ result = gem_list["test2"].name
30
29
  assert_equal("test2",result)
31
- result = lockfilegems.result["test2"].version
30
+ result = gem_list["test2"].version
32
31
  assert_equal(Gem::Version.new("1.2.3"), result)
33
- result = lockfilegems.result["test3"].name
32
+ result = gem_list["test3"].name
34
33
  assert_equal("test3",result)
35
- result = lockfilegems.result["test3"].version
34
+ result = gem_list["test3"].version
36
35
  assert_equal(Gem::Version.new("1.2.3"), result)
37
- result = lockfilegems.result["test4"].name
36
+ result = gem_list["test4"].name
38
37
  assert_equal("test4",result)
39
- result = lockfilegems.result["test4"].version
38
+ result = gem_list["test4"].version
40
39
  assert_equal(Gem::Version.new("1.2.3"), result)
41
- result = lockfilegems.result["from_git"].version
40
+ result = gem_list["from_git"].version
42
41
  assert_equal(Gem::Version.new("1.0.3"), result)
43
- result = lockfilegems.result["dep_from_git"].version
42
+ result = gem_list["dep_from_git"].version
44
43
  assert_equal(Gem::Version.new("1.0.0"), result)
45
44
  end
45
+ def test_filename
46
+ conf = {}
47
+ conf["filename"] = "fn"
48
+ conf["gems_url"] = "gu"
49
+ conf["classname"] = "LockfileGems"
50
+ lg = GemsStatus::LockfileGems.new(conf)
51
+ assert_equal(lg.filename, "fn")
52
+ end
46
53
 
47
54
  end
48
55
 
@@ -0,0 +1,158 @@
1
+ require './test/test-helper.rb'
2
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
3
+ require 'test/unit'
4
+ require 'gems-status'
5
+
6
+ module GemsStatus
7
+ class NotASecurityAlertChecker
8
+ attr_reader :security_messages, :fixed
9
+ attr_accessor :emails
10
+ def initialize(conf)
11
+ @security_messages = {}
12
+ @fixed = {}
13
+ end
14
+ public :match_name, :key_for_emails, :look_in_emails, :gem_uri, :filter_security_messages_already_fixed
15
+ end
16
+ class MockGem
17
+ def name
18
+ "NAME"
19
+ end
20
+ def origin
21
+ "ORG"
22
+ end
23
+ def date
24
+ Date.new(2012, 12, 12)
25
+ end
26
+ end
27
+ class MockEmail
28
+ def uid
29
+ "UID"
30
+ end
31
+ def subject
32
+ "subject"
33
+ end
34
+ end
35
+ class NotASecurityAlertCheckerTest <Test::Unit::TestCase
36
+ def test_match_name
37
+ ch = NotASecurityAlertChecker.new([])
38
+ assert ch.match_name("rubygem mail", "mail")
39
+ assert !ch.match_name("mail","mail")
40
+ assert ch.match_name("ruby mail", "mail")
41
+ assert ch.match_name("mail gem", "mail")
42
+ end
43
+
44
+ def test_key_for_emails
45
+ ch = NotASecurityAlertChecker.new([])
46
+ result = ch.key_for_emails( "LN", MockGem.new, MockEmail.new)
47
+ assert_equal "email_LN_NAME_ORG_UID", result
48
+ end
49
+
50
+ def test_look_in_emails_for_rubyonrails_sec_mail
51
+ ch = NotASecurityAlertChecker.new([])
52
+ ch.emails = {
53
+ "rubyonrails-security@googlegroups.com" => [MockEmail.new]
54
+ }
55
+ gem = MockGem.new
56
+ def gem.name
57
+ "rails"
58
+ end
59
+ assert_equal Hash, ch.security_messages.class
60
+ assert_equal 0, ch.security_messages.length
61
+ ch.look_in_emails(gem)
62
+ assert_equal Hash, ch.security_messages.class
63
+ assert_equal 1, ch.security_messages.length
64
+ end
65
+
66
+ def test_look_in_emails_for_other_mail
67
+ mail = MockEmail.new
68
+ def mail.subject
69
+ "gem rails"
70
+ end
71
+ ch = NotASecurityAlertChecker.new([])
72
+ ch.emails = {
73
+ "other" => [mail]
74
+ }
75
+ gem = MockGem.new
76
+ def gem.name
77
+ "rails"
78
+ end
79
+ assert_equal Hash, ch.security_messages.class
80
+ assert_equal 0, ch.security_messages.length
81
+ ch.look_in_emails(gem)
82
+ assert_equal Hash, ch.security_messages.class
83
+ assert_equal 1, ch.security_messages.length
84
+ end
85
+
86
+ def test_gem_uri_with_project_uri
87
+ ch = NotASecurityAlertChecker.new([])
88
+
89
+ result = ch.gem_uri({"project_uri" => "github.com/a"})
90
+ assert_equal "github.com/a", result
91
+ result = ch.gem_uri({"project_uri" => "a"})
92
+ assert_equal nil, result
93
+ end
94
+
95
+ def test_gem_uri_with_homepage_url
96
+ ch = NotASecurityAlertChecker.new([])
97
+
98
+ result = ch.gem_uri({"homepage_uri" => "github.com/a"})
99
+ assert_equal "github.com/a", result
100
+ result = ch.gem_uri({"homepage_uri" => "a"})
101
+ assert_equal nil, result
102
+ end
103
+
104
+ def test_gem_uri_with_source_code_uri
105
+ ch = NotASecurityAlertChecker.new([])
106
+
107
+ result = ch.gem_uri({"source_code_uri" => "github.com/a"})
108
+ assert_equal "github.com/a", result
109
+ result = ch.gem_uri({"source_code_uri" => "a"})
110
+ assert_equal nil, result
111
+ end
112
+
113
+ def test_filter_security_messages_already_fixed_with_equal_version
114
+ ch = NotASecurityAlertChecker.new([])
115
+ gem = MockGem.new
116
+ ch.security_messages["key"] = gem
117
+ ch.fixed["key"] = "1.1.1"
118
+ version = Gem::Version.new("1.1.1")
119
+ date = Date.new(2011, 12, 12)
120
+ ch.filter_security_messages_already_fixed(version, date)
121
+ assert_equal 0, ch.security_messages.length
122
+ end
123
+
124
+ def test_filter_security_messages_already_fixed_with_newer_version
125
+ ch = NotASecurityAlertChecker.new([])
126
+ gem = MockGem.new
127
+ ch.security_messages["key"] = gem
128
+ ch.fixed["key"] = "1.1.0"
129
+ version = Gem::Version.new("1.1.1")
130
+ date = Date.new(2011, 12, 12)
131
+ ch.filter_security_messages_already_fixed(version, date)
132
+ assert_equal 0, ch.security_messages.length
133
+ end
134
+
135
+ def test_filter_security_messages_already_fixed_with_older_version
136
+ ch = NotASecurityAlertChecker.new([])
137
+ gem = MockGem.new
138
+ ch.security_messages["key"] = gem
139
+ ch.fixed["key"] = "1.1.2"
140
+ version = Gem::Version.new("1.1.1")
141
+ date = Date.new(2011, 12, 12)
142
+ ch.filter_security_messages_already_fixed(version, date)
143
+ assert_equal 1, ch.security_messages.length
144
+ end
145
+
146
+ def test_filter_security_messages_already_fixed_with_newer_date
147
+ ch = NotASecurityAlertChecker.new([])
148
+ gem = MockGem.new
149
+ ch.security_messages["key"] = gem
150
+ ch.fixed["key"] = "1.1.2"
151
+ version = Gem::Version.new("1.1.1")
152
+ date = Date.new(2013, 12, 12)
153
+ ch.filter_security_messages_already_fixed(version, date)
154
+ assert_equal 0, ch.security_messages.length
155
+ end
156
+
157
+ end
158
+ end