security 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0980117aec9bb1d85ec00fefc9ea234d0f66b7b80d3932e6f90c99d606ed6e96'
4
- data.tar.gz: 0f49377f8092f1170da75ffda17f65c0213f77bdc1ed371c6993f4b016b4ca9d
3
+ metadata.gz: f878a3070c6bc072f8bf7e0dfe17a8db85dec7b32685353498a642ea76c95176
4
+ data.tar.gz: '02093024c12b425b231eadbe56963433929e1844870dedeab1fda5f31b1c4a2b'
5
5
  SHA512:
6
- metadata.gz: 5899c11de7a95d4babea7edfcdaaa469dbbec27edd2f746afbc276bda596c54f17641db99aed2e362acac66b842c313b29b2345526d4eb8edba228f61d2486f0
7
- data.tar.gz: '08f05552094356cdbe5841deee2316f4ba7ab080026b4a7a77771ae00ae9f7c0920cc9a4946f1bb8c8d4b1523237e4131041a331c69c44f7a0fab32402b44a62'
6
+ metadata.gz: 7afe1f89bd8fda3701c8f31bb80b669107debea3ed191250a19d091fca665bc7b4572311f42b99a744b9a9c3a86657ca1d813420016fe07059bc4643a163c3de
7
+ data.tar.gz: eacec975d67c63faef11e7b20d4bd2c361d2daa5607ff7852fb2410bb0e71ba8e0926d75d2b158f733f423290648ca33ca91f522022ef987de64e41b2e16eea5
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
 
3
5
  gemspec
data/Gemfile.lock CHANGED
@@ -1,19 +1,58 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- security (0.1.4)
4
+ security (0.1.5)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ ast (2.4.2)
10
+ diff-lcs (1.4.4)
11
+ parallel (1.20.1)
12
+ parser (3.0.0.0)
13
+ ast (~> 2.4.1)
14
+ rainbow (3.0.0)
9
15
  rake (12.3.3)
16
+ regexp_parser (2.1.1)
17
+ rexml (3.2.4)
18
+ rspec (3.10.0)
19
+ rspec-core (~> 3.10.0)
20
+ rspec-expectations (~> 3.10.0)
21
+ rspec-mocks (~> 3.10.0)
22
+ rspec-core (3.10.1)
23
+ rspec-support (~> 3.10.0)
24
+ rspec-expectations (3.10.1)
25
+ diff-lcs (>= 1.2.0, < 2.0)
26
+ rspec-support (~> 3.10.0)
27
+ rspec-github (2.3.1)
28
+ rspec-core (~> 3.0)
29
+ rspec-mocks (3.10.2)
30
+ diff-lcs (>= 1.2.0, < 2.0)
31
+ rspec-support (~> 3.10.0)
32
+ rspec-support (3.10.2)
33
+ rubocop (1.12.0)
34
+ parallel (~> 1.10)
35
+ parser (>= 3.0.0.0)
36
+ rainbow (>= 2.2.2, < 4.0)
37
+ regexp_parser (>= 1.8, < 3.0)
38
+ rexml
39
+ rubocop-ast (>= 1.2.0, < 2.0)
40
+ ruby-progressbar (~> 1.7)
41
+ unicode-display_width (>= 1.4.0, < 3.0)
42
+ rubocop-ast (1.4.1)
43
+ parser (>= 2.7.1.5)
44
+ ruby-progressbar (1.11.0)
45
+ unicode-display_width (2.0.0)
10
46
 
11
47
  PLATFORMS
12
- ruby
48
+ x86_64-darwin-19
13
49
 
14
50
  DEPENDENCIES
15
51
  rake (~> 12.3, >= 12.3.3)
52
+ rspec
53
+ rspec-github
54
+ rubocop
16
55
  security!
17
56
 
18
57
  BUNDLED WITH
19
- 2.1.4
58
+ 2.2.8
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 – 2021 Mattt (https://mat.tt/)
1
+ Copyright (c) 2012 – 2021 The Fastlane Community Contributors
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,14 +1,19 @@
1
1
  # Security
2
2
 
3
+ [![Build Status][build status badge]][build status]
4
+ [![Gem](https://img.shields.io/gem/v/security.svg?style=flat)](https://rubygems.org/gems/security)
5
+ [![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/fastlane-community/security/blob/main/LICENSE.md)
6
+
3
7
  **A library for interacting with the macOS Keychain**
4
8
 
5
- > This library implements only the commands necessary for password management in
6
- > [Cupertino](https://github.com/mattt/cupertino).
7
- > As such, some methods are stubbed out to raise `NotImplementedError`.
9
+ > This library provides only a subset of `security` subcommands,
10
+ > and is not intended for general use.
8
11
 
9
12
  ## Usage
10
13
 
11
14
  ```ruby
15
+ require 'security'
16
+
12
17
  Security::Keychain::default_keychain.filename #=> "/Users/jappleseed/Library/Keychains/login.keychain"
13
18
 
14
19
  Security::InternetPassword.find(server: "itunesconnect.apple.com").password #=> "p4ssw0rd"
@@ -18,6 +23,5 @@ Security::InternetPassword.find(server: "itunesconnect.apple.com").password #=>
18
23
 
19
24
  MIT
20
25
 
21
- ## Contact
22
-
23
- Mattt ([@mattt](https://twitter.com/mattt))
26
+ [build status]: https://github.com/mattt/Security/actions?query=workflow%3ACI
27
+ [build status badge]: https://github.com/mattt/Security/workflows/CI/badge.svg
data/Rakefile CHANGED
@@ -1,10 +1,10 @@
1
- require "bundler"
2
- Bundler.setup
1
+ # frozen_string_literal: true
3
2
 
4
- gemspec = eval(File.read("security.gemspec"))
3
+ require 'bundler'
4
+ Bundler.setup
5
5
 
6
- task :build => "#{gemspec.full_name}.gem"
6
+ require 'bundler/gem_tasks'
7
7
 
8
- file "#{gemspec.full_name}.gem" => gemspec.files + ["security.gemspec"] do
9
- system "gem build security.gemspec"
8
+ task :default do
9
+ system 'rake -T'
10
10
  end
data/lib/security.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'security/version'
2
4
  require 'security/keychain'
3
5
  require 'security/certificate'
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Security
4
+ # :nodoc:
2
5
  class Certificate
3
6
  private_class_method :new
4
7
 
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'shellwords'
2
4
 
3
5
  module Security
6
+ # :nodoc:
4
7
  class Keychain
5
- DOMAINS = [:user, :system, :common, :dynamic]
8
+ DOMAINS = %i[user system common dynamic].freeze
6
9
 
7
10
  attr_reader :filename
8
11
 
@@ -11,19 +14,19 @@ module Security
11
14
  end
12
15
 
13
16
  def info
14
- system %{security show-keychain-info #{@filename.shellescape}}
17
+ system %(security show-keychain-info #{@filename.shellescape})
15
18
  end
16
19
 
17
20
  def lock
18
- system %{security lock-keychain #{@filename.shellescape}}
21
+ system %(security lock-keychain #{@filename.shellescape})
19
22
  end
20
23
 
21
24
  def unlock(password)
22
- system %{security unlock-keychain -p #{password.shellescape} #{@filename.shellescape}}
25
+ system %(security unlock-keychain -p #{password.shellescape} #{@filename.shellescape})
23
26
  end
24
27
 
25
28
  def delete
26
- system %{security delete-keychain #{@filename.shellescape}}
29
+ system %(security delete-keychain #{@filename.shellescape})
27
30
  end
28
31
 
29
32
  class << self
@@ -38,11 +41,11 @@ module Security
38
41
  end
39
42
 
40
43
  def lock
41
- system %{security lock-keychain -a}
44
+ system %(security lock-keychain -a)
42
45
  end
43
46
 
44
47
  def unlock(password)
45
- system %{security unlock-keychain -p #{password.shellescape}}
48
+ system %(security unlock-keychain -p #{password.shellescape})
46
49
  end
47
50
 
48
51
  def default_keychain
@@ -56,7 +59,7 @@ module Security
56
59
  private
57
60
 
58
61
  def keychains_from_output(output)
59
- output.split(/\n/).collect{|line| new(line.strip.gsub(/^\"|\"$/, ""))}
62
+ output.split(/\n/).collect { |line| new(line.strip.gsub(/^"|"$/, '')) }
60
63
  end
61
64
  end
62
65
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'shellwords'
2
4
 
3
5
  module Security
6
+ # :nodoc:
4
7
  class Password
5
8
  attr_reader :keychain, :attributes, :password
6
9
 
@@ -16,17 +19,23 @@ module Security
16
19
  private
17
20
 
18
21
  def password_from_output(output)
19
- return nil if /^security\: / === output
22
+ return nil if output.match?(/^security: /)
20
23
 
21
- keychain, attributes, password = nil, {}, nil
24
+ keychain = nil
25
+ attributes = {}
26
+ password = nil
22
27
  output.split(/\n/).each do |line|
23
28
  case line
24
- when /^keychain\: \"(.+)\"/
25
- keychain = $1
26
- when /\"(\w{4})\".+\=\"(.+)\"/
27
- attributes[$1] = $2
28
- when /^password\: \"(.+)\"/
29
- password = $1
29
+ when /^keychain: "(.+)"/
30
+ keychain = Regexp.last_match(1)
31
+ when /"(\w{4})".+="(.+)"/
32
+ attributes[Regexp.last_match(1)] = Regexp.last_match(2)
33
+ when /"(\w{4})"<blob>=0x([[:xdigit:]]+)/
34
+ attributes[Regexp.last_match(1)] = decode_hex_blob(Regexp.last_match(2))
35
+ when /^password: "(.+)"/
36
+ password = Regexp.last_match(1)
37
+ when /^password: 0x([[:xdigit:]]+)/
38
+ password = decode_hex_blob(Regexp.last_match(1))
30
39
  end
31
40
  end
32
41
 
@@ -42,11 +51,16 @@ module Security
42
51
  flags[:G] ||= flags.delete(:value)
43
52
  flags[:j] ||= flags.delete(:comment)
44
53
 
45
- flags.delete_if{|k,v| v.nil?}.collect{|k, v| "-#{k} #{v.shellescape}".strip}.join(" ")
54
+ flags.delete_if { |_k, v| v.nil? }.collect { |k, v| "-#{k} #{v.shellescape}".strip }.join(' ')
55
+ end
56
+
57
+ def decode_hex_blob(string)
58
+ [string].pack('H*').force_encoding('UTF-8')
46
59
  end
47
60
  end
48
61
  end
49
62
 
63
+ # :nodoc:
50
64
  class GenericPassword < Password
51
65
  class << self
52
66
  def add(service, account, password, options = {})
@@ -74,6 +88,7 @@ module Security
74
88
  end
75
89
  end
76
90
 
91
+ # :nodoc:
77
92
  class InternetPassword < Password
78
93
  class << self
79
94
  def add(server, account, password, options = {})
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
1
4
  module Security
2
- VERSION = "0.1.4"
5
+ VERSION = '0.1.5'
3
6
  end
data/security.gemspec CHANGED
@@ -1,21 +1,26 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "security"
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
4
+ require 'security'
4
5
 
5
6
  Gem::Specification.new do |s|
6
- s.name = "security"
7
- s.authors = ["Mattt"]
8
- s.email = "mattt@me.com"
9
- s.homepage = "https://mat.tt/"
7
+ s.name = 'security'
8
+ s.authors = ['Josh Holtz', 'Mattt']
9
+ s.email = 'me@joshholtz.com'
10
+ s.homepage = 'https://github.com/fastlane-community/security'
10
11
  s.version = Security::VERSION
11
12
  s.platform = Gem::Platform::RUBY
12
- s.license = "MIT"
13
- s.summary = "Interact with the macOS Keychain"
14
-
15
- s.add_development_dependency 'rake', '~> 12.3', '>= 12.3.3'
13
+ s.license = 'MIT'
14
+ s.summary = 'Interact with the macOS Keychain'
16
15
 
17
- s.files = Dir["./**/*"].reject { |file| file =~ /\.\/(bin|log|pkg|script|spec|test|vendor)/ }
16
+ s.files = Dir['./**/*'].reject { |file| file =~ %r{\./(bin|log|pkg|script|spec|test|vendor)} }
18
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
- s.require_paths = ["lib"]
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
19
+ s.require_paths = ['lib']
20
+ s.required_ruby_version = '>= 2.4.0'
21
+
22
+ s.add_development_dependency 'rake', '~> 12.3', '>= 12.3.3'
23
+ s.add_development_dependency 'rspec'
24
+ s.add_development_dependency 'rspec-github'
25
+ s.add_development_dependency 'rubocop'
21
26
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe Certificate do
4
+ describe '#find' do
5
+ it 'should raise NotImplementedError' do
6
+ expect { Certificate.find }.to raise_error(NotImplementedError)
7
+ end
8
+ end
9
+
10
+ describe '#initialize' do
11
+ it 'should raise NoMethodError' do
12
+ expect { Certificate.new }.to raise_error(NoMethodError, /private method/)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tempfile'
4
+
5
+ describe Keychain do
6
+ describe '#login_keychain' do
7
+ subject { Keychain.login_keychain }
8
+
9
+ it 'should be located in the user home directory' do
10
+ expect(subject.filename).to be == File.expand_path('~/Library/Keychains/login.keychain-db')
11
+ end
12
+ end
13
+
14
+ describe '#create' do
15
+ let(:password) { 'p4ssw0rd!' }
16
+
17
+ it 'should raise NotImplementedError' do
18
+ Tempfile.open('example.keychain-db') do |tmp|
19
+ expect { Keychain.create(tmp.path, password) }.to raise_error(NotImplementedError)
20
+ end
21
+ end
22
+ end
23
+
24
+ describe '#list' do
25
+ describe 'when passing no arguments' do
26
+ it 'should list keychains in user domain' do
27
+ expect(Keychain.list).to satisfy { |keychains|
28
+ keychains.map(&:filename) == Keychain.list(:user).map(&:filename)
29
+ }
30
+ end
31
+ end
32
+
33
+ describe 'when passing a valid domain' do
34
+ it 'should not raise an error' do
35
+ expect { Keychain.list(:user) }.not_to raise_error
36
+ expect { Keychain.list(:system) }.not_to raise_error
37
+ expect { Keychain.list(:common) }.not_to raise_error
38
+ expect { Keychain.list(:dynamic) }.not_to raise_error
39
+ end
40
+ end
41
+
42
+ describe 'when passing an invalid domain' do
43
+ it 'should raise an error' do
44
+ expect { Keychain.list(:invalid) }.to raise_error(NoMethodError) # FIXME
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GenericPassword do
4
+ let(:keychain) { Keychain.login_keychain } # FIXME: we should create a temporary keychain for tests
5
+
6
+ describe '#add' do
7
+ let(:service) { 'com.example.service' }
8
+ let(:account) { 'jappleseed' }
9
+ let(:password) { 'p4ssw0rd!' }
10
+ let(:comment) { 'Some comment' }
11
+
12
+ around(:example) do |example|
13
+ GenericPassword.add(service, account, password, comment: comment)
14
+ example.run
15
+ GenericPassword.delete({ service: service, account: account })
16
+ end
17
+
18
+ it 'should be added to the keychain' do
19
+ entry = GenericPassword.find({ account: account })
20
+ expect(entry.keychain.filename).to be == keychain.filename
21
+ expect(entry.attributes).to include({
22
+ 'acct' => account,
23
+ 'svce' => service,
24
+ 'icmt' => comment
25
+ })
26
+ expect(entry.password).to be == password
27
+ end
28
+ end
29
+ end
30
+
31
+ describe InternetPassword do
32
+ let(:keychain) { Keychain.login_keychain } # FIXME: we should create a temporary keychain for tests
33
+
34
+ describe '#add' do
35
+ let(:server) { 'example.com' }
36
+ let(:account) { 'jappleseed@example.com' }
37
+
38
+ describe 'ascii password' do
39
+ let(:password) { 'p4ssw0rd!' }
40
+ let(:comment) { 'Some comment' }
41
+
42
+ around(:example) do |example|
43
+ InternetPassword.add(server, account, password, comment: comment)
44
+ example.run
45
+ InternetPassword.delete({ server: server, account: account })
46
+ end
47
+
48
+ it 'should be added to the keychain' do
49
+ entry = InternetPassword.find({ account: account })
50
+ expect(entry.keychain.filename).to be == keychain.filename
51
+ expect(entry.attributes).to include({
52
+ 'acct' => account,
53
+ 'srvr' => server,
54
+ 'icmt' => comment
55
+ })
56
+ expect(entry.password).to be == password
57
+ end
58
+ end
59
+
60
+ describe 'ascii password with backslash' do
61
+ let(:password) { 'p4ssw\0rd!' }
62
+
63
+ around(:example) do |example|
64
+ InternetPassword.add(server, account, password)
65
+ example.run
66
+ InternetPassword.delete({ server: server, account: account })
67
+ end
68
+
69
+ it 'should be added to the keychain' do
70
+ entry = InternetPassword.find({ account: account })
71
+ expect(entry.keychain.filename).to be == keychain.filename
72
+ expect(entry.attributes).to include({
73
+ 'acct' => account,
74
+ 'srvr' => server
75
+ })
76
+ expect(entry.password).to be == password
77
+ end
78
+ end
79
+
80
+ describe 'non-ascii password' do
81
+ let(:password) { '•••p4ssw0rd!••' }
82
+ let(:comment) { '•••Some comment•••' }
83
+
84
+ around(:example) do |example|
85
+ InternetPassword.add(server, account, password, comment: comment)
86
+ example.run
87
+ InternetPassword.delete({ server: server, account: account })
88
+ end
89
+
90
+ it 'should be added to the keychain' do
91
+ entry = InternetPassword.find({ account: account })
92
+ expect(entry.keychain.filename).to be == keychain.filename
93
+ expect(entry.attributes).to include({
94
+ 'acct' => account,
95
+ 'srvr' => server,
96
+ 'icmt' => comment
97
+ })
98
+ expect(entry.password).to be == password
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../lib/security'
4
+
5
+ # rubocop:disable Style/MixinUsage
6
+ include Security
7
+ # rubocop:enable Style/MixinUsage
8
+
9
+ # This file was generated by the `rspec --init` command. Conventionally, all
10
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
11
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
12
+ # this file to always be loaded, without a need to explicitly require it in any
13
+ # files.
14
+ #
15
+ # Given that it is always loaded, you are encouraged to keep this file as
16
+ # light-weight as possible. Requiring heavyweight dependencies from this file
17
+ # will add to the boot time of your test suite on EVERY test run, even for an
18
+ # individual file that may not need all of that loaded. Instead, consider making
19
+ # a separate helper file that requires the additional dependencies and performs
20
+ # the additional setup, and require it from the spec files that actually need
21
+ # it.
22
+ #
23
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
24
+ RSpec.configure do |config|
25
+ # rspec-expectations config goes here. You can use an alternate
26
+ # assertion/expectation library such as wrong or the stdlib/minitest
27
+ # assertions if you prefer.
28
+ config.expect_with :rspec do |expectations|
29
+ # This option will default to `true` in RSpec 4. It makes the `description`
30
+ # and `failure_message` of custom matchers include text for helper methods
31
+ # defined using `chain`, e.g.:
32
+ # be_bigger_than(2).and_smaller_than(4).description
33
+ # # => "be bigger than 2 and smaller than 4"
34
+ # ...rather than:
35
+ # # => "be bigger than 2"
36
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
37
+ end
38
+
39
+ # rspec-mocks config goes here. You can use an alternate test double
40
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
41
+ config.mock_with :rspec do |mocks|
42
+ # Prevents you from mocking or stubbing a method that does not exist on
43
+ # a real object. This is generally recommended, and will default to
44
+ # `true` in RSpec 4.
45
+ mocks.verify_partial_doubles = true
46
+ end
47
+
48
+ # This option will default to `:apply_to_host_groups` in RSpec 4 (and will
49
+ # have no way to turn it off -- the option exists only for backwards
50
+ # compatibility in RSpec 3). It causes shared context metadata to be
51
+ # inherited by the metadata hash of host groups and examples, rather than
52
+ # triggering implicit auto-inclusion in groups with matching metadata.
53
+ config.shared_context_metadata_behavior = :apply_to_host_groups
54
+
55
+ # The settings below are suggested to provide a good initial experience
56
+ # with RSpec, but feel free to customize to your heart's content.
57
+ # # This allows you to limit a spec run to individual examples or groups
58
+ # # you care about by tagging them with `:focus` metadata. When nothing
59
+ # # is tagged with `:focus`, all examples get run. RSpec also provides
60
+ # # aliases for `it`, `describe`, and `context` that include `:focus`
61
+ # # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
62
+ # config.filter_run_when_matching :focus
63
+ #
64
+ # # Allows RSpec to persist some state between runs in order to support
65
+ # # the `--only-failures` and `--next-failure` CLI options. We recommend
66
+ # # you configure your source control system to ignore this file.
67
+ # config.example_status_persistence_file_path = "spec/examples.txt"
68
+ #
69
+ # # Limits the available syntax to the non-monkey patched syntax that is
70
+ # # recommended. For more details, see:
71
+ # # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
72
+ # # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
73
+ # # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
74
+ # config.disable_monkey_patching!
75
+ #
76
+ # # This setting enables warnings. It's recommended, but in some cases may
77
+ # # be too noisy due to issues in dependencies.
78
+ # config.warnings = true
79
+ #
80
+ # # Many RSpec users commonly either run the entire suite or an individual
81
+ # # file, and it's useful to allow more verbose output when running an
82
+ # # individual spec file.
83
+ # if config.files_to_run.one?
84
+ # # Use the documentation formatter for detailed output,
85
+ # # unless a formatter has already been configured
86
+ # # (e.g. via a command-line flag).
87
+ # config.default_formatter = "doc"
88
+ # end
89
+ #
90
+ # # Print the 10 slowest examples and example groups at the
91
+ # # end of the spec run, to help surface which specs are running
92
+ # # particularly slow.
93
+ # config.profile_examples = 10
94
+ #
95
+ # # Run specs in random order to surface order dependencies. If you find an
96
+ # # order dependency and want to debug it, you can fix the order by providing
97
+ # # the seed, which is printed after each run.
98
+ # # --seed 1234
99
+ # config.order = :random
100
+ #
101
+ # # Seed global randomization in this process using the `--seed` CLI option.
102
+ # # Setting this allows you to use `--seed` to deterministically reproduce
103
+ # # test failures related to randomization by passing the same `--seed` value
104
+ # # as the one that triggered the failure.
105
+ # Kernel.srand config.seed
106
+ end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: security
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
+ - Josh Holtz
7
8
  - Mattt
8
- autorequire:
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2021-03-02 00:00:00.000000000 Z
12
+ date: 2021-03-25 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rake
@@ -30,8 +31,50 @@ dependencies:
30
31
  - - ">="
31
32
  - !ruby/object:Gem::Version
32
33
  version: 12.3.3
33
- description:
34
- email: mattt@me.com
34
+ - !ruby/object:Gem::Dependency
35
+ name: rspec
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ type: :development
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ - !ruby/object:Gem::Dependency
49
+ name: rspec-github
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rubocop
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ description:
77
+ email: me@joshholtz.com
35
78
  executables: []
36
79
  extensions: []
37
80
  extra_rdoc_files: []
@@ -46,13 +89,16 @@ files:
46
89
  - "./lib/security/keychain.rb"
47
90
  - "./lib/security/password.rb"
48
91
  - "./lib/security/version.rb"
49
- - "./security-0.1.3.gem"
50
92
  - "./security.gemspec"
51
- homepage: https://mat.tt/
93
+ - spec/certificate_spec.rb
94
+ - spec/keychain_spec.rb
95
+ - spec/password_spec.rb
96
+ - spec/spec_helper.rb
97
+ homepage: https://github.com/fastlane-community/security
52
98
  licenses:
53
99
  - MIT
54
100
  metadata: {}
55
- post_install_message:
101
+ post_install_message:
56
102
  rdoc_options: []
57
103
  require_paths:
58
104
  - lib
@@ -60,15 +106,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
60
106
  requirements:
61
107
  - - ">="
62
108
  - !ruby/object:Gem::Version
63
- version: '0'
109
+ version: 2.4.0
64
110
  required_rubygems_version: !ruby/object:Gem::Requirement
65
111
  requirements:
66
112
  - - ">="
67
113
  - !ruby/object:Gem::Version
68
114
  version: '0'
69
115
  requirements: []
70
- rubygems_version: 3.1.2
71
- signing_key:
116
+ rubygems_version: 3.0.3
117
+ signing_key:
72
118
  specification_version: 4
73
119
  summary: Interact with the macOS Keychain
74
- test_files: []
120
+ test_files:
121
+ - spec/certificate_spec.rb
122
+ - spec/keychain_spec.rb
123
+ - spec/password_spec.rb
124
+ - spec/spec_helper.rb
data/security-0.1.3.gem DELETED
Binary file