cocoapods-keys 1.4.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +2 -2
- data/SWIFT_PROJECTS.md +1 -12
- data/lib/cocoapods_keys.rb +1 -1
- data/lib/key_master.rb +3 -0
- data/lib/keyring.rb +22 -4
- data/lib/keyring_liberator.rb +22 -1
- data/lib/name_whisperer.rb +3 -2
- data/lib/plugin.rb +8 -2
- data/lib/pod/command/keys.rb +12 -0
- data/lib/pod/command/keys/get.rb +2 -11
- data/lib/pod/command/keys/list.rb +1 -2
- data/lib/pod/command/keys/rm.rb +0 -9
- data/lib/pod/command/keys/set.rb +1 -13
- data/lib/preinstaller.rb +22 -3
- data/spec/functional_spec.rb +7 -0
- data/spec/key_master_spec.rb +18 -0
- data/spec/keyring_liberator_spec.rb +7 -0
- data/spec/keyring_spec.rb +31 -0
- data/spec/spec_helper.rb +10 -0
- 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: 52a2e9e5a65b7647780f3f3bb143293366a86120
|
4
|
+
data.tar.gz: a2c043948ff253e77f4b4defaaaf17a9fb35f9fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9aa97fd504108cfce1a9442f45ea009dcce868a0371e258c7992f432da6b66507021e8b03e0a4c94eb1bdea5b5cadc46e658b0d6d322b55504d653e5de787416
|
7
|
+
data.tar.gz: 695c2710be5f212f3685f065c316eacbe07ef01dcaceca057935a4014d0bff4d3dc3a400e6e42d6e9c2a5ac8a862a550659c753bd44a4155fa3a8b4dba0b4772
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/SWIFT_PROJECTS.md
CHANGED
@@ -3,20 +3,9 @@
|
|
3
3
|
Once you've followed the setup instructions described in the [Usage](/orta/cocoapods-keys#usage)
|
4
4
|
section of the README, you have two choices.
|
5
5
|
|
6
|
-
## Using the bridge header
|
7
|
-
|
8
|
-
If you want to make your keys available to your whole project:
|
9
|
-
|
10
|
-
1. Make sure you have a [bridging header](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html) already setup.
|
11
|
-
2. In the bridging header, import the generated key file:
|
12
|
-
```objectivec
|
13
|
-
#import <Keys/MyApplicationKeys.h>
|
14
|
-
```
|
15
|
-
|
16
6
|
## Importing the framework
|
17
7
|
|
18
|
-
|
19
|
-
specific files, simply use Swift's `import` statement. The name of the generated
|
8
|
+
Use Swift's `import` statement. The name of the generated
|
20
9
|
module is `Keys`.
|
21
10
|
|
22
11
|
```swift
|
data/lib/cocoapods_keys.rb
CHANGED
data/lib/key_master.rb
CHANGED
data/lib/keyring.rb
CHANGED
@@ -6,7 +6,7 @@ module CocoaPodsKeys
|
|
6
6
|
|
7
7
|
def initialize(name, path, keys = [])
|
8
8
|
@name = name.to_s
|
9
|
-
@path = path
|
9
|
+
@path = path.to_s
|
10
10
|
@keys = keys
|
11
11
|
end
|
12
12
|
|
@@ -26,18 +26,36 @@ module CocoaPodsKeys
|
|
26
26
|
'cocoapods-keys-'
|
27
27
|
end
|
28
28
|
|
29
|
+
def keychain
|
30
|
+
@keychain ||= OSXKeychain.new
|
31
|
+
end
|
32
|
+
|
29
33
|
def save(key, value)
|
30
|
-
keychain = OSXKeychain.new
|
31
34
|
keychain[self.class.keychain_prefix + name, key] = value
|
32
35
|
end
|
33
36
|
|
34
37
|
def keychain_data
|
35
|
-
keychain = OSXKeychain.new
|
36
38
|
Hash[
|
37
|
-
@keys.map { |key| [key,
|
39
|
+
@keys.map { |key| [key, keychain_value(key)] }
|
38
40
|
]
|
39
41
|
end
|
40
42
|
|
43
|
+
def keychain_has_key?(key)
|
44
|
+
has_key = !keychain_value(key).nil?
|
45
|
+
|
46
|
+
if has_key && !@keys.include?(key)
|
47
|
+
@keys << key
|
48
|
+
elsif !has_key && @keys.include?(key)
|
49
|
+
@keys.delete(key)
|
50
|
+
end
|
51
|
+
|
52
|
+
has_key
|
53
|
+
end
|
54
|
+
|
55
|
+
def keychain_value(key)
|
56
|
+
ENV[key] || keychain[self.class.keychain_prefix + name, key]
|
57
|
+
end
|
58
|
+
|
41
59
|
def camel_cased_keys
|
42
60
|
Hash[keychain_data.map { |(key, value)| [key[0].downcase + key[1..-1], value] }]
|
43
61
|
end
|
data/lib/keyring_liberator.rb
CHANGED
@@ -24,9 +24,30 @@ module CocoaPodsKeys
|
|
24
24
|
get_all_keyrings.find { |k| k.name == name }
|
25
25
|
end
|
26
26
|
|
27
|
+
def self.get_current_keyring(name, cwd)
|
28
|
+
found_by_name = name && get_all_keyrings.find { |k| k.name == name && k.path == cwd.to_s }
|
29
|
+
found_by_name || KeyringLiberator.get_keyring(cwd)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.get_all_keyrings_named(name)
|
33
|
+
get_all_keyrings.find_all { |k| k.name == name }
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.prompt_if_already_existing(keyring)
|
37
|
+
keyrings = get_all_keyrings_named(keyring.name)
|
38
|
+
already_exists = File.exist?(yaml_path_for_path(keyring.path))
|
39
|
+
if !already_exists && keyrings.any? { |existing_keyring| File.exist?(yaml_path_for_path(existing_keyring.path)) }
|
40
|
+
ui = Pod::UserInterface
|
41
|
+
ui.puts "About to create a duplicate keyring file for project #{keyring.name.green}"
|
42
|
+
ui.puts 'Entries in your Apple Keychain will be shared between both projects.'
|
43
|
+
ui.puts "\nPress enter to continue, or `ctrl + c` to cancel"
|
44
|
+
ui.gets
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
27
48
|
def self.save_keyring(keyring)
|
28
49
|
keys_dir.mkpath
|
29
|
-
|
50
|
+
prompt_if_already_existing(keyring)
|
30
51
|
yaml_path_for_path(keyring.path).open('w') { |f| f.write(YAML.dump(keyring.to_hash)) }
|
31
52
|
end
|
32
53
|
|
data/lib/name_whisperer.rb
CHANGED
@@ -21,12 +21,13 @@ module CocoaPodsKeys
|
|
21
21
|
|
22
22
|
def self.search_folders_for_xcodeproj
|
23
23
|
ui = Pod::UserInterface
|
24
|
-
xcodeprojects = Pathname.glob('**/*.xcodeproj')
|
24
|
+
xcodeprojects = Pathname.glob('**/*.xcodeproj').reject { |path| path.to_s.start_with?('Pods/') }
|
25
25
|
if xcodeprojects.length == 1
|
26
26
|
Pathname(xcodeprojects.first).basename('.xcodeproj')
|
27
27
|
else
|
28
28
|
error_message = (xcodeprojects.length > 1) ? 'found too many' : "couldn't find any"
|
29
|
-
|
29
|
+
projects = xcodeprojects.map(&:basename).join(' ')
|
30
|
+
ui.puts 'CocoaPods-Keys ' + error_message + ' Xcode projects (' + projects + '). Please give a name for this project.'
|
30
31
|
|
31
32
|
answer = ''
|
32
33
|
loop do
|
data/lib/plugin.rb
CHANGED
@@ -25,8 +25,7 @@ module CocoaPodsKeys
|
|
25
25
|
local_user_options = user_options || {}
|
26
26
|
project = local_user_options.fetch('project') { CocoaPodsKeys::NameWhisperer.get_project_name }
|
27
27
|
|
28
|
-
keyring = KeyringLiberator.
|
29
|
-
KeyringLiberator.get_keyring(Dir.getwd) ||
|
28
|
+
keyring = KeyringLiberator.get_current_keyring(project, Dir.getwd) ||
|
30
29
|
Keyring.new(project, Dir.getwd, local_user_options['keys'])
|
31
30
|
|
32
31
|
raise Pod::Informative, 'Could not load keyring' unless keyring
|
@@ -41,6 +40,13 @@ module CocoaPodsKeys
|
|
41
40
|
|
42
41
|
# Add our template podspec
|
43
42
|
add_keys_to_pods(keys_path.relative_path_from(installation_root), user_options)
|
43
|
+
|
44
|
+
# Remove the shared scheme for this pod
|
45
|
+
Pod::HooksManager.register('cocoapods-keys', :post_install) do |context, user_options|
|
46
|
+
shared_scheme_path = "Pods/Pods.xcodeproj/xcshareddata/xcschemes/Keys.xcscheme"
|
47
|
+
FileUtils.rm(shared_scheme_path) if File.exist?(shared_scheme_path)
|
48
|
+
end
|
49
|
+
|
44
50
|
end
|
45
51
|
|
46
52
|
def add_keys_to_pods(keys_path, options)
|
data/lib/pod/command/keys.rb
CHANGED
@@ -16,6 +16,18 @@ module Pod
|
|
16
16
|
|
17
17
|
self.abstract_command = true
|
18
18
|
self.default_subcommand = 'list'
|
19
|
+
|
20
|
+
def create_keyring
|
21
|
+
current_dir = Pathname.pwd
|
22
|
+
name = @project_name || CocoaPodsKeys::NameWhisperer.get_project_name
|
23
|
+
CocoaPodsKeys::Keyring.new(name, current_dir, [])
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_current_keyring
|
27
|
+
current_dir = Pathname.pwd
|
28
|
+
project = @project_name || CocoaPodsKeys::NameWhisperer.get_project_name
|
29
|
+
CocoaPodsKeys::KeyringLiberator.get_current_keyring(project, current_dir)
|
30
|
+
end
|
19
31
|
end
|
20
32
|
end
|
21
33
|
end
|
data/lib/pod/command/keys/get.rb
CHANGED
@@ -35,21 +35,12 @@ module Pod
|
|
35
35
|
end
|
36
36
|
|
37
37
|
if keyring.keys.include? @key_name
|
38
|
-
data = keyring.
|
39
|
-
UI.puts data
|
38
|
+
data = keyring.keychain_value(@key_name)
|
39
|
+
UI.puts data
|
40
40
|
else
|
41
41
|
raise Informative, 'Could not find value'
|
42
42
|
end
|
43
43
|
end
|
44
|
-
|
45
|
-
def get_current_keyring
|
46
|
-
current_dir = Pathname.pwd
|
47
|
-
keyring = CocoaPodsKeys::KeyringLiberator.get_keyring current_dir
|
48
|
-
if !keyring && @project_name
|
49
|
-
return CocoaPodsKeys::KeyringLiberator.get_keyring_named @project_name
|
50
|
-
end
|
51
|
-
keyring
|
52
|
-
end
|
53
44
|
end
|
54
45
|
end
|
55
46
|
end
|
@@ -14,13 +14,12 @@ module Pod
|
|
14
14
|
|
15
15
|
def run
|
16
16
|
# List all settings for current app
|
17
|
-
this_keyring =
|
17
|
+
this_keyring = get_current_keyring
|
18
18
|
if this_keyring
|
19
19
|
display_current_keyring this_keyring
|
20
20
|
end
|
21
21
|
|
22
22
|
# List all known bundle ids
|
23
|
-
|
24
23
|
all_keyrings = CocoaPodsKeys::KeyringLiberator.get_all_keyrings
|
25
24
|
all_keyrings.each do |keyring|
|
26
25
|
display_keyring(keyring) if !this_keyring || keyring.path != this_keyring.path
|
data/lib/pod/command/keys/rm.rb
CHANGED
@@ -55,15 +55,6 @@ module Pod
|
|
55
55
|
raise Informative, "Could not find key named #{@key_name}."
|
56
56
|
end
|
57
57
|
end
|
58
|
-
|
59
|
-
def get_current_keyring
|
60
|
-
current_dir = Pathname.pwd
|
61
|
-
keyring = CocoaPodsKeys::KeyringLiberator.get_keyring current_dir
|
62
|
-
if !keyring && @project_name
|
63
|
-
return CocoaPodsKeys::KeyringLiberator.get_keyring_named @project_name
|
64
|
-
end
|
65
|
-
keyring
|
66
|
-
end
|
67
58
|
end
|
68
59
|
end
|
69
60
|
end
|
data/lib/pod/command/keys/set.rb
CHANGED
@@ -38,7 +38,7 @@ module Pod
|
|
38
38
|
# set a key to a folder id in ~/.cocoapods/keys
|
39
39
|
# info "Saving into the keychain."
|
40
40
|
|
41
|
-
keyring =
|
41
|
+
keyring = get_current_keyring || create_keyring
|
42
42
|
keyring.keys << @key_name.tr('-', '_')
|
43
43
|
CocoaPodsKeys::KeyringLiberator.save_keyring keyring
|
44
44
|
|
@@ -46,18 +46,6 @@ module Pod
|
|
46
46
|
|
47
47
|
UI.puts "Saved #{@key_name} to #{keyring.name}." unless config.silent?
|
48
48
|
end
|
49
|
-
|
50
|
-
def current_keyring
|
51
|
-
current_dir = Pathname.pwd
|
52
|
-
keyring = CocoaPodsKeys::KeyringLiberator.get_keyring current_dir
|
53
|
-
|
54
|
-
unless keyring
|
55
|
-
name = @project_name || CocoaPodsKeys::NameWhisperer.get_project_name
|
56
|
-
keyring = CocoaPodsKeys::Keyring.new(name, current_dir, [])
|
57
|
-
end
|
58
|
-
|
59
|
-
keyring
|
60
|
-
end
|
61
49
|
end
|
62
50
|
end
|
63
51
|
end
|
data/lib/preinstaller.rb
CHANGED
@@ -17,16 +17,20 @@ module CocoaPodsKeys
|
|
17
17
|
options = @user_options || {}
|
18
18
|
current_dir = Pathname.pwd
|
19
19
|
project = options.fetch('project') { CocoaPodsKeys::NameWhisperer.get_project_name }
|
20
|
-
|
20
|
+
|
21
|
+
keyring = KeyringLiberator.get_current_keyring(project, current_dir)
|
22
|
+
|
23
|
+
unless keyring
|
24
|
+
check_for_multiple_keyrings(project, current_dir)
|
25
|
+
end
|
21
26
|
|
22
27
|
existing_keyring = !keyring.nil?
|
23
28
|
keyring = CocoaPodsKeys::Keyring.new(project, current_dir, []) unless keyring
|
24
29
|
|
25
|
-
data = keyring.keychain_data
|
26
30
|
has_shown_intro = false
|
27
31
|
keys = options.fetch('keys', [])
|
28
32
|
keys.each do |key|
|
29
|
-
unless
|
33
|
+
unless keyring.keychain_has_key?(key)
|
30
34
|
unless has_shown_intro
|
31
35
|
ui.puts "\n CocoaPods-Keys has detected a keys mismatch for your setup."
|
32
36
|
has_shown_intro = true
|
@@ -46,8 +50,23 @@ module CocoaPodsKeys
|
|
46
50
|
setter.run
|
47
51
|
end
|
48
52
|
end
|
53
|
+
CocoaPodsKeys::KeyringLiberator.save_keyring(keyring)
|
49
54
|
|
50
55
|
existing_keyring || !keys.empty?
|
51
56
|
end
|
57
|
+
|
58
|
+
def check_for_multiple_keyrings(project, current_dir)
|
59
|
+
ui = Pod::UserInterface
|
60
|
+
keyrings = KeyringLiberator.get_all_keyrings_named(project)
|
61
|
+
if keyrings.count > 1
|
62
|
+
ui.puts "Found multiple keyrings for project #{project.inspect}, but"
|
63
|
+
ui.puts "no match found for current path (#{current_dir}):"
|
64
|
+
keyrings.each do |found_keyring|
|
65
|
+
ui.puts "- #{found_keyring.path}"
|
66
|
+
end
|
67
|
+
ui.puts "\nPress enter to create a new keyring, or `ctrl + c` to cancel"
|
68
|
+
ui.gets
|
69
|
+
end
|
70
|
+
end
|
52
71
|
end
|
53
72
|
end
|
data/spec/functional_spec.rb
CHANGED
@@ -29,6 +29,13 @@ describe 'CocoaPodsKeys functional tests' do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
after :all do
|
33
|
+
KeyringLiberator.get_all_keyrings_named('TestProject').each do |keyring|
|
34
|
+
file = KeyringLiberator.yaml_path_for_path(keyring.path)
|
35
|
+
FileUtils.rm(file) if File.exist?(file)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
32
39
|
it 'does not directly encode the keys into the implementation file' do
|
33
40
|
source = File.read(File.join(@tmpdir, 'Pods/CocoaPodsKeys/TestProjectKeys.m'))
|
34
41
|
expect(source).to_not include('such-data')
|
data/spec/key_master_spec.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'keyring'
|
2
3
|
require 'key_master'
|
3
4
|
require 'tmpdir'
|
4
5
|
|
6
|
+
include CocoaPodsKeys
|
7
|
+
|
5
8
|
describe CocoaPodsKeys::KeyMaster do
|
6
9
|
# Previous tests operated under assumption that
|
7
10
|
# empty keychains were OK. See for more info:
|
@@ -23,4 +26,19 @@ describe CocoaPodsKeys::KeyMaster do
|
|
23
26
|
system(`xcrun --sdk macosx --find clang`.strip, '-fsyntax-only', m_file)
|
24
27
|
end
|
25
28
|
end
|
29
|
+
|
30
|
+
describe '#name' do
|
31
|
+
it 'takes keyring with name that starts with number returns augmented the name with underscore' do
|
32
|
+
keyring = Keyring.new('500px', '/', ['ARMyKey'])
|
33
|
+
keyring.instance_variable_set(:@keychain, FakeKeychain.new('ARMyKey' => 'secretkey'))
|
34
|
+
key_master = KeyMaster.new(keyring)
|
35
|
+
expect(key_master.name).to eq('_500pxKeys')
|
36
|
+
end
|
37
|
+
it 'takes keyring with proper name returns proper Keys file' do
|
38
|
+
keyring = Keyring.new('Artsy', '/', ['ARMyKey'])
|
39
|
+
keyring.instance_variable_set(:@keychain, FakeKeychain.new('ARMyKey' => 'secretkey'))
|
40
|
+
key_master = KeyMaster.new(keyring)
|
41
|
+
expect(key_master.name).to eq('ArtsyKeys')
|
42
|
+
end
|
43
|
+
end
|
26
44
|
end
|
@@ -21,6 +21,13 @@ describe KeyringLiberator do
|
|
21
21
|
expect(KeyringLiberator.get_keyring_named('test')).to equal(keyring)
|
22
22
|
end
|
23
23
|
|
24
|
+
it 'should find many by name' do
|
25
|
+
keyring1 = Keyring.from_hash('name' => 'test', 'path' => 'testpath1', 'keys' => [])
|
26
|
+
keyring2 = Keyring.from_hash('name' => 'test', 'path' => 'testpath2', 'keys' => [])
|
27
|
+
allow(KeyringLiberator).to receive(:get_all_keyrings).and_return([keyring1, keyring2])
|
28
|
+
expect(KeyringLiberator.get_all_keyrings_named('test')).to eq([keyring1, keyring2])
|
29
|
+
end
|
30
|
+
|
24
31
|
it 'should be nil if nothing found find by name' do
|
25
32
|
keyring = Keyring.from_hash('name' => 'test', 'path' => 'testpath', 'keys' => [])
|
26
33
|
allow(KeyringLiberator).to receive(:get_all_keyrings).and_return([keyring])
|
data/spec/keyring_spec.rb
CHANGED
@@ -16,4 +16,35 @@ describe KeyringLiberator do
|
|
16
16
|
keyring = Keyring.new('test', '/', ['ARMyKey'])
|
17
17
|
expect(keyring.keychain_data).to eq('ARMyKey' => 'Hello')
|
18
18
|
end
|
19
|
+
|
20
|
+
it 'looks up keys from the OSXKeychain' do
|
21
|
+
keyring = Keyring.new('test', '/', ['ARMyKey'])
|
22
|
+
keyring.instance_variable_set(:@keychain, FakeKeychain.new('KeychainKey' => 'abcde'))
|
23
|
+
expect(keyring.keychain_has_key?('KeychainKey')).to be_truthy
|
24
|
+
expect(keyring.keychain_value('KeychainKey')).to eq('abcde')
|
25
|
+
expect(keyring.keychain_has_key?('NotMyKey')).to be_falsey
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'looks up keys from ENV' do
|
29
|
+
keyring = Keyring.new('test', '/', ['ARMyKey'])
|
30
|
+
ENV['EnvKey'] = '12345'
|
31
|
+
keyring.instance_variable_set(:@keychain, FakeKeychain.new('KeychainKey' => 'abcde'))
|
32
|
+
expect(keyring.keychain_has_key?('EnvKey')).to be_truthy
|
33
|
+
expect(keyring.keychain_value('EnvKey')).to eq('12345')
|
34
|
+
expect(keyring.keychain_has_key?('NotMyKey')).to be_falsey
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'updates its list of keys' do
|
38
|
+
keyring = Keyring.new('test', '/', ['NotMyKey'])
|
39
|
+
ENV['EnvKey'] = '12345'
|
40
|
+
keyring.instance_variable_set(:@keychain, FakeKeychain.new('KeychainKey' => 'abcde'))
|
41
|
+
|
42
|
+
keyring.keychain_has_key?('KeychainKey')
|
43
|
+
keyring.keychain_has_key?('EnvKey')
|
44
|
+
keyring.keychain_has_key?('NotMyKey')
|
45
|
+
|
46
|
+
expect(keyring.keys.include?('KeychainKey')).to be_truthy
|
47
|
+
expect(keyring.keys.include?('EnvKey')).to be_truthy
|
48
|
+
expect(keyring.keys.include?('NotMyKey')).to be_falsey
|
49
|
+
end
|
19
50
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods-keys
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Orta Therox
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-09-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: osx_keychain
|