cocoapods-keys 0.9.5 → 1.0.0
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/Gemfile.lock +1 -1
- data/README.md +35 -3
- data/lib/cocoapods_keys.rb +1 -1
- data/lib/key_master.rb +29 -8
- data/lib/keyring.rb +6 -6
- data/lib/keyring_liberator.rb +4 -0
- data/lib/plugin.rb +67 -3
- data/lib/pod/command/keys.rb +3 -0
- data/lib/pod/command/keys/generate.rb +43 -0
- data/lib/pod/command/keys/get.rb +59 -0
- data/lib/pod/command/keys/rm.rb +71 -0
- data/lib/preinstaller.rb +47 -0
- metadata +6 -3
- data/lib/installer.rb +0 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43e284067bd4672be8b813d0f5590572156eabda
|
4
|
+
data.tar.gz: 42960e0f836c6b72f6e8a34869346e0c1ada5b00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f6de3d8e783506b471617ed1b67f385376734ce85f606996f1d11b17273513a77a0cff78992aace1501b38c3a419676b7e181bc1596dfac104badffa2fa0b758
|
7
|
+
data.tar.gz: ab271fdb4dc0027451ae75f3e36f9097a691c3b6a30020f0b1d21b01e40bf338c2897116cc32ad02bf5718a9ec1434409a0868b8cca27261febc832cca0acfec
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -14,7 +14,7 @@ Requires CocoaPods 0.34+.
|
|
14
14
|
|
15
15
|
Key names are stored in `~/cocoapods/keys/` and key values in the OS X keychain. When you run `pod install` or `pod update`, an Objective-C class is created with scrambled versions of the keys, making it difficult to just [dump](https://github.com/stefanesser/dumpdecrypted) the contents of the decrypted binary and extract the keys. At runtime, the keys are unscrambled for use in your app.
|
16
16
|
|
17
|
-
The generated Objective-C classes are stored in the `Pods/Keys` directory, so if you're checking in your [Pods folder](http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control), just add `Pods/Keys` to your `.gitignore` file.
|
17
|
+
The generated Objective-C classes are stored in the `Pods/Keys` directory, so if you're checking in your [Pods folder](http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control), just add `Pods/Keys` to your `.gitignore` file. CocoaPods-Keys supports integration in Swift or Objective-C projects.
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
@@ -45,12 +45,12 @@ For example:
|
|
45
45
|
└ redditAPIToken & mixpanelAPIToken
|
46
46
|
```
|
47
47
|
|
48
|
-
After the next `pod install` or `pod update` keys will add a new
|
48
|
+
After the next `pod install` or `pod update` keys will add a new `Keys` framework to your Pods project. This provides an API to your keys from Cocoa code. For example the application code above would look like:
|
49
49
|
|
50
50
|
``` objc
|
51
51
|
|
52
52
|
#import "ORAppDelegate.h"
|
53
|
-
#import <
|
53
|
+
#import <Keys/MyApplicationKeys.h>
|
54
54
|
#import <ARAnalytics/ARAnalytics.h>
|
55
55
|
|
56
56
|
@implementation ORAppDelegate
|
@@ -67,6 +67,38 @@ After the next `pod install` or `pod update` keys will add a new Objective-C cla
|
|
67
67
|
|
68
68
|
```
|
69
69
|
|
70
|
+
## Usage via CocoaPods 0.36
|
71
|
+
|
72
|
+
Using the new Plugin API in CocoaPods we can automate a lot of the fiddly bits away. You define what keys you want inside your [Podfile](https://github.com/artsy/eidolon/blob/0a9f5947914eb637fd4abf364fa3532b56da3c52/Podfile#L6-L21) and Keys will detect what keys are not yet set. If you need to specify a different project name from the target name, use the key `:target` to specify it.
|
73
|
+
|
74
|
+
```
|
75
|
+
plugin 'cocoapods-keys', {
|
76
|
+
:project => "Eidolon",
|
77
|
+
:keys => [
|
78
|
+
"ArtsyAPIClientSecret",
|
79
|
+
"ArtsyAPIClientKey",
|
80
|
+
"HockeyProductionSecret",
|
81
|
+
"HockeyBetaSecret",
|
82
|
+
"MixpanelProductionAPIClientKey",
|
83
|
+
...
|
84
|
+
]}
|
85
|
+
```
|
86
|
+
|
87
|
+
Then running `pod install` will prompt for the keys not yet set and you can ensure everyone has the same setup.
|
88
|
+
|
89
|
+
#### Other commands
|
90
|
+
|
91
|
+
CocoaPods-keys has 3 other commands:
|
92
|
+
|
93
|
+
* `pod keys get [key] [optional project]`
|
94
|
+
Which will output the value of the key to STDOUT, useful for scripting.
|
95
|
+
|
96
|
+
* `pod keys rm [key] [optional project]`
|
97
|
+
Will remove a key from a project.
|
98
|
+
|
99
|
+
* `pod keys generate [optional project]`
|
100
|
+
Will generate the obfuscated Objective-C keys class (mainly used internally).
|
101
|
+
|
70
102
|
#### Security
|
71
103
|
|
72
104
|
Key security is difficult. Right now even the biggest apps get their keys [leaked](https://threatpost.com/twitter-oauth-api-keys-leaked-030713/77597). This is neatly summed up by John Adams of the Twitter Security Team on [Quora](http://www.quora.com/Twitter-1/How-were-the-Twitter-iPhone-and-Android-OAuth-keys-leaked).
|
data/lib/cocoapods_keys.rb
CHANGED
data/lib/key_master.rb
CHANGED
@@ -21,7 +21,8 @@ module CocoaPodsKeys
|
|
21
21
|
|
22
22
|
@data_length = @keys.values.map(&:length).reduce(:+) * (20 + rand(10))
|
23
23
|
data = `head -c #{@data_length} /dev/random | base64 | head -c #{@data_length}`
|
24
|
-
|
24
|
+
data = data + '\\"'
|
25
|
+
@data_length = data.length
|
25
26
|
|
26
27
|
# Swap the characters within the hashed string with the characters from
|
27
28
|
# the keyring values. Then store that index in a index-ed copy of the values.
|
@@ -32,15 +33,20 @@ module CocoaPodsKeys
|
|
32
33
|
value.chars.each_with_index do |char, char_index|
|
33
34
|
loop do
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
data[index] = char
|
38
|
-
|
39
|
-
@used_indexes << index
|
36
|
+
if char == '"'
|
37
|
+
index = data.delete('\\').length - 1
|
40
38
|
@indexed_keys[key][char_index] = index
|
41
39
|
break
|
40
|
+
else
|
41
|
+
index = rand data.length
|
42
|
+
unless @used_indexes.include?(index)
|
43
|
+
data[index] = char
|
44
|
+
|
45
|
+
@used_indexes << index
|
46
|
+
@indexed_keys[key][char_index] = index
|
47
|
+
break
|
48
|
+
end
|
42
49
|
end
|
43
|
-
|
44
50
|
end
|
45
51
|
end
|
46
52
|
end
|
@@ -79,6 +85,7 @@ SOURCE
|
|
79
85
|
//
|
80
86
|
|
81
87
|
#import <objc/runtime.h>
|
88
|
+
#import <Foundation/NSDictionary.h>
|
82
89
|
#import "<%= @name %>.h"
|
83
90
|
|
84
91
|
#pragma clang diagnostic push
|
@@ -121,6 +128,20 @@ static NSString *_podKeys<%= Digest::MD5.hexdigest(key) %>(<%= name %> *self, SE
|
|
121
128
|
|
122
129
|
static char <%= name %>Data[<%= @data_length %>] = "<%= @data %>";
|
123
130
|
|
131
|
+
- (NSString *)description
|
132
|
+
{
|
133
|
+
return [@{
|
134
|
+
<%- @keys.each do |key, value| -%>
|
135
|
+
@"<%= key %>": self.<%= key %>,
|
136
|
+
<%- end -%>
|
137
|
+
} description];
|
138
|
+
}
|
139
|
+
|
140
|
+
- (id)debugQuickLookObject
|
141
|
+
{
|
142
|
+
return [self description];
|
143
|
+
}
|
144
|
+
|
124
145
|
@end
|
125
146
|
SOURCE
|
126
147
|
|
@@ -131,7 +152,7 @@ SOURCE
|
|
131
152
|
|
132
153
|
def render_erb(erb)
|
133
154
|
require 'erb'
|
134
|
-
ERB.new(erb).result(binding)
|
155
|
+
ERB.new(erb, nil, '-').result(binding)
|
135
156
|
end
|
136
157
|
|
137
158
|
def key_data_arrays
|
data/lib/keyring.rb
CHANGED
@@ -22,21 +22,21 @@ module CocoaPodsKeys
|
|
22
22
|
name.split(/[^a-zA-Z0-9_]/).map { |s| s[0].upcase + s[1..-1] }.join('')
|
23
23
|
end
|
24
24
|
|
25
|
+
def self.keychain_prefix
|
26
|
+
"cocoapods-keys-"
|
27
|
+
end
|
28
|
+
|
25
29
|
def save(key, value)
|
26
30
|
keychain = OSXKeychain.new
|
27
|
-
keychain[keychain_prefix + name, key] = value
|
31
|
+
keychain[self.class.keychain_prefix + name, key] = value
|
28
32
|
end
|
29
33
|
|
30
34
|
def keychain_data
|
31
35
|
keychain = OSXKeychain.new
|
32
36
|
Hash[
|
33
|
-
@keys.map { |key| [key, keychain[keychain_prefix + name, key]] }
|
37
|
+
@keys.map { |key| [key, keychain[self.class.keychain_prefix + name, key]] }
|
34
38
|
]
|
35
39
|
end
|
36
40
|
|
37
|
-
def keychain_prefix
|
38
|
-
"cocoapods-keys-"
|
39
|
-
end
|
40
|
-
|
41
41
|
end
|
42
42
|
end
|
data/lib/keyring_liberator.rb
CHANGED
@@ -20,6 +20,10 @@ module CocoaPodsKeys
|
|
20
20
|
def self.get_keyring(path)
|
21
21
|
get_keyring_at_path(yaml_path_for_path(path))
|
22
22
|
end
|
23
|
+
|
24
|
+
def self.get_keyring_named(name)
|
25
|
+
self.get_all_keyrings.find { |k| k.name == name }
|
26
|
+
end
|
23
27
|
|
24
28
|
def self.save_keyring(keyring)
|
25
29
|
`mkdir -p #{keys_dir}`
|
data/lib/plugin.rb
CHANGED
@@ -1,8 +1,72 @@
|
|
1
|
+
require 'cocoapods-core'
|
2
|
+
|
1
3
|
module CocoaPodsKeys
|
4
|
+
class << self
|
5
|
+
def podspec_for_current_project(spec_contents)
|
6
|
+
keyring = KeyringLiberator.get_keyring_named(user_options["project"]) || KeyringLiberator.get_keyring(Dir.getwd)
|
7
|
+
raise Informative, "Could not load keyring" unless keyring
|
8
|
+
key_master = KeyMaster.new(keyring)
|
9
|
+
|
10
|
+
spec_contents.gsub!(/%%SOURCE_FILES%%/, "#{key_master.name}.{h,m}")
|
11
|
+
spec_contents.gsub!(/%%PROJECT_NAME%%/, user_options["project"])
|
12
|
+
end
|
13
|
+
|
14
|
+
def setup
|
15
|
+
require 'preinstaller'
|
16
|
+
|
17
|
+
PreInstaller.new(user_options).setup
|
18
|
+
# Add our template podspec (needs to be remote, not local).
|
19
|
+
podfile.pod 'Keys', :git => 'https://github.com/ashfurrow/empty-podspec.git'
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def podfile
|
25
|
+
Pod::Config.instance.podfile
|
26
|
+
end
|
27
|
+
|
28
|
+
def user_options
|
29
|
+
podfile.plugins["cocoapods-keys"]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
module Pod
|
35
|
+
class Installer
|
36
|
+
alias_method :install_before_cocoapods_keys!, :install!
|
37
|
+
|
38
|
+
def install!
|
39
|
+
CocoaPodsKeys.setup
|
40
|
+
install_before_cocoapods_keys!
|
41
|
+
end
|
42
|
+
|
43
|
+
class Analyzer
|
44
|
+
class SandboxAnalyzer
|
45
|
+
alias_method :pod_state_before_cocoapods_keys, :pod_state
|
46
|
+
|
47
|
+
def pod_state(pod)
|
48
|
+
if pod == 'Keys'
|
49
|
+
# return :added if we were, otherwise assume the Keys have :changed since last install, following my mother's "Better Safe than Sorry" principle.
|
50
|
+
return :added if pod_added?(pod)
|
51
|
+
:changed
|
52
|
+
else
|
53
|
+
pod_state_before_cocoapods_keys(pod)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
2
59
|
|
3
|
-
|
4
|
-
|
60
|
+
class Specification
|
61
|
+
class << self
|
62
|
+
alias_method :from_string_before_cocoapods_keys, :from_string
|
5
63
|
|
6
|
-
|
64
|
+
def from_string(spec_contents, path, subspec_name = nil)
|
65
|
+
if path.to_s.include? "Keys.podspec"
|
66
|
+
CocoaPodsKeys.podspec_for_current_project(spec_contents)
|
67
|
+
end
|
68
|
+
from_string_before_cocoapods_keys(spec_contents, path, subspec_name)
|
69
|
+
end
|
70
|
+
end
|
7
71
|
end
|
8
72
|
end
|
data/lib/pod/command/keys.rb
CHANGED
@@ -4,6 +4,9 @@ module Pod
|
|
4
4
|
class Keys < Command
|
5
5
|
require 'pod/command/keys/list'
|
6
6
|
require 'pod/command/keys/set'
|
7
|
+
require 'pod/command/keys/get'
|
8
|
+
require 'pod/command/keys/rm'
|
9
|
+
require 'pod/command/keys/generate'
|
7
10
|
|
8
11
|
self.summary = "A key value store for environment settings in Cocoa Apps."
|
9
12
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'keyring_liberator'
|
2
|
+
require 'key_master'
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
class Command
|
6
|
+
class Keys
|
7
|
+
class Generate < Keys
|
8
|
+
include CocoaPodsKeys
|
9
|
+
|
10
|
+
self.summary = "Generates the .h and .m files representing the keys."
|
11
|
+
|
12
|
+
self.description = <<-DESC
|
13
|
+
Generates the Objective-C class containing obfuscated keys for the project
|
14
|
+
in the current working directory (if it exists). The .h and .m files are
|
15
|
+
generated in the current working directory.
|
16
|
+
DESC
|
17
|
+
|
18
|
+
def initialize(argv)
|
19
|
+
@project_name = argv.shift_argument
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def run
|
24
|
+
key_master = KeyMaster.new(@keyring)
|
25
|
+
|
26
|
+
interface_file = key_master.name + '.h'
|
27
|
+
implementation_file = key_master.name + '.m'
|
28
|
+
|
29
|
+
File.write(interface_file, key_master.interface)
|
30
|
+
File.write(implementation_file, key_master.implementation)
|
31
|
+
end
|
32
|
+
|
33
|
+
def validate!
|
34
|
+
super
|
35
|
+
verify_podfile_exists!
|
36
|
+
|
37
|
+
@keyring = KeyringLiberator.get_keyring_named(@project_name) || KeyringLiberator.get_keyring(Dir.getwd)
|
38
|
+
help! "No keys associated with this directory or project name." unless @keyring
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require "keyring_liberator"
|
2
|
+
require "name_whisperer"
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
class Command
|
6
|
+
class Keys
|
7
|
+
|
8
|
+
class Get < Keys
|
9
|
+
self.summary = "Print a values of a key."
|
10
|
+
|
11
|
+
self.description = <<-DESC
|
12
|
+
Outputs the value of a key to SDTOUT
|
13
|
+
|
14
|
+
A second optional operator can be done to force a project name.
|
15
|
+
DESC
|
16
|
+
|
17
|
+
self.arguments = [CLAide::Argument.new('key', true),
|
18
|
+
CLAide::Argument.new('project_name', false)]
|
19
|
+
|
20
|
+
def initialize(argv)
|
21
|
+
@key_name = argv.shift_argument
|
22
|
+
@project_name = argv.shift_argument
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def validate!
|
27
|
+
super
|
28
|
+
verify_podfile_exists!
|
29
|
+
help! "A key name is required for lookup." unless @key_name
|
30
|
+
end
|
31
|
+
|
32
|
+
def run
|
33
|
+
keyring = get_current_keyring
|
34
|
+
if !keyring
|
35
|
+
$stderr.puts "Could not find a project for this folder"
|
36
|
+
return
|
37
|
+
end
|
38
|
+
|
39
|
+
if keyring.keys.include? @key_name
|
40
|
+
data = keyring.keychain_data
|
41
|
+
$stderr.puts data[@key_name]
|
42
|
+
else
|
43
|
+
$stderr.puts "Could not find value"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_current_keyring
|
48
|
+
current_dir = Dir.getwd
|
49
|
+
keyring = CocoaPodsKeys::KeyringLiberator.get_keyring current_dir
|
50
|
+
if !keyring && @project_name
|
51
|
+
return CocoaPodsKeys::KeyringLiberator.get_keyring_named @project_name
|
52
|
+
end
|
53
|
+
keyring
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require "keyring_liberator"
|
2
|
+
require "keyring"
|
3
|
+
require "name_whisperer"
|
4
|
+
|
5
|
+
module Pod
|
6
|
+
class Command
|
7
|
+
class Keys
|
8
|
+
|
9
|
+
class Rm < Keys
|
10
|
+
self.summary = "Remove a key-value pair from a project."
|
11
|
+
|
12
|
+
self.description = <<-DESC
|
13
|
+
Remove a key, and it's value from a project
|
14
|
+
|
15
|
+
A second optional operator can be done to force a project name.
|
16
|
+
DESC
|
17
|
+
|
18
|
+
self.arguments = [CLAide::Argument.new('key', true), CLAide::Argument.new('project_name', false)]
|
19
|
+
|
20
|
+
def initialize(argv)
|
21
|
+
@key_name = argv.shift_argument
|
22
|
+
@project_name = argv.shift_argument
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def validate!
|
27
|
+
super
|
28
|
+
verify_podfile_exists!
|
29
|
+
help! "A key name is required for lookup." unless @key_name
|
30
|
+
end
|
31
|
+
|
32
|
+
def run
|
33
|
+
keyring = get_current_keyring
|
34
|
+
if !keyring
|
35
|
+
$stderr.puts "Could not find a project to remove the key from."
|
36
|
+
return
|
37
|
+
end
|
38
|
+
|
39
|
+
if keyring.keys.include? @key_name
|
40
|
+
keyring.save(@key_name, "")
|
41
|
+
keyring.keys.delete @key_name
|
42
|
+
CocoaPodsKeys::KeyringLiberator.save_keyring(keyring)
|
43
|
+
|
44
|
+
prefix = CocoaPodsKeys::Keyring.keychain_prefix
|
45
|
+
delete_generic = `security delete-generic-password -a #{@key_name} -l #{prefix+keyring.name} 2>&1`
|
46
|
+
|
47
|
+
if delete_generic.include? "security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain."
|
48
|
+
$stderr.puts "Removed value for #{@key_name}, but could not delete from Keychain."
|
49
|
+
elsif delete_generic.include? "password has been deleted."
|
50
|
+
$stderr.puts "Removed value for #{@key_name}, and deleted associated key in Keychain."
|
51
|
+
else
|
52
|
+
$stderr.puts "Removed value for #{@key_name}."
|
53
|
+
end
|
54
|
+
else
|
55
|
+
$stderr.puts "Could not find key named #{@key_name}."
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def get_current_keyring
|
60
|
+
current_dir = Dir.getwd
|
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
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/preinstaller.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
module CocoaPodsKeys
|
2
|
+
class PreInstaller
|
3
|
+
def initialize(user_options)
|
4
|
+
@options = user_options
|
5
|
+
end
|
6
|
+
|
7
|
+
def setup
|
8
|
+
require 'key_master'
|
9
|
+
require 'keyring_liberator'
|
10
|
+
require 'pod/command/keys/set'
|
11
|
+
|
12
|
+
current_dir = Dir.getwd
|
13
|
+
keyring = KeyringLiberator.get_keyring_named(@options["project"]) || KeyringLiberator.get_keyring(current_dir)
|
14
|
+
unless keyring
|
15
|
+
name = @options["project"] || CocoaPodsKeys::NameWhisperer.get_project_name
|
16
|
+
keyring = CocoaPodsKeys::Keyring.new(name, current_dir, [])
|
17
|
+
end
|
18
|
+
|
19
|
+
data = keyring.keychain_data
|
20
|
+
has_shown_intro = false
|
21
|
+
@options["keys"].each do |key|
|
22
|
+
unless data.keys.include? key
|
23
|
+
|
24
|
+
unless has_shown_intro
|
25
|
+
puts "\n CocoaPods-Keys has detected a keys mismatch for your setup."
|
26
|
+
has_shown_intro = true
|
27
|
+
end
|
28
|
+
|
29
|
+
puts " What is the key for " + key.green
|
30
|
+
answer = ""
|
31
|
+
loop do
|
32
|
+
print " > "
|
33
|
+
answer = STDIN.gets.chomp
|
34
|
+
break if answer.length > 0
|
35
|
+
end
|
36
|
+
|
37
|
+
puts ""
|
38
|
+
args = CLAide::ARGV.new([key, answer, keyring.name])
|
39
|
+
setter = Pod::Command::Keys::Set.new(args)
|
40
|
+
setter.run
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
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: 0.
|
4
|
+
version: 1.0.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:
|
12
|
+
date: 2015-02-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: osx_keychain
|
@@ -70,15 +70,18 @@ files:
|
|
70
70
|
- cocoapods_keys.gemspec
|
71
71
|
- lib/cocoapods_keys.rb
|
72
72
|
- lib/cocoapods_plugin.rb
|
73
|
-
- lib/installer.rb
|
74
73
|
- lib/key_master.rb
|
75
74
|
- lib/keyring.rb
|
76
75
|
- lib/keyring_liberator.rb
|
77
76
|
- lib/name_whisperer.rb
|
78
77
|
- lib/plugin.rb
|
79
78
|
- lib/pod/command/keys.rb
|
79
|
+
- lib/pod/command/keys/generate.rb
|
80
|
+
- lib/pod/command/keys/get.rb
|
80
81
|
- lib/pod/command/keys/list.rb
|
82
|
+
- lib/pod/command/keys/rm.rb
|
81
83
|
- lib/pod/command/keys/set.rb
|
84
|
+
- lib/preinstaller.rb
|
82
85
|
homepage: https://github.com/cocoapods/cocoapods-keys
|
83
86
|
licenses:
|
84
87
|
- MIT
|
data/lib/installer.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
module CocoaPodsKeys
|
2
|
-
class Installer
|
3
|
-
def initialize(sandbox_root)
|
4
|
-
@sandbox_root = sandbox_root
|
5
|
-
end
|
6
|
-
|
7
|
-
def install!
|
8
|
-
require 'key_master'
|
9
|
-
require 'keyring_liberator'
|
10
|
-
|
11
|
-
keyring = KeyringLiberator.get_keyring(Dir.getwd)
|
12
|
-
|
13
|
-
return unless keyring
|
14
|
-
|
15
|
-
Pod::UI.section 'Adding keys' do
|
16
|
-
key_master = KeyMaster.new(keyring)
|
17
|
-
|
18
|
-
keys_folder = File.join(@sandbox_root, 'Keys')
|
19
|
-
keys_headers_folder = File.join(@sandbox_root, 'Headers', 'Public', 'CocoaPods-Keys')
|
20
|
-
interface_name = key_master.name + '.h'
|
21
|
-
interface_file = File.join(keys_headers_folder, interface_name)
|
22
|
-
implementation_file = File.join(keys_folder, key_master.name + '.m')
|
23
|
-
|
24
|
-
Dir.mkdir keys_folder unless Dir.exists? keys_folder
|
25
|
-
Dir.mkdir keys_headers_folder unless Dir.exists? keys_headers_folder
|
26
|
-
File.open(interface_file, 'w') { |f| f.write(key_master.interface) }
|
27
|
-
File.open(implementation_file, 'w') { |f| f.write(key_master.implementation) }
|
28
|
-
|
29
|
-
project = Xcodeproj::Project.open File.join(@sandbox_root, 'Pods.xcodeproj')
|
30
|
-
|
31
|
-
group = project.new_group('Keys')
|
32
|
-
interface = group.new_file(interface_file)
|
33
|
-
implementation = group.new_file(implementation_file)
|
34
|
-
|
35
|
-
pods_target = project.targets.detect { |t| t.name == 'Pods' }
|
36
|
-
unless pods_target
|
37
|
-
pods_target = project.targets.detect { |t| t.name == 'Pods-' + keyring.name }
|
38
|
-
end
|
39
|
-
|
40
|
-
pods_target.add_file_references [implementation]
|
41
|
-
|
42
|
-
# Swift Pod support
|
43
|
-
if pods_target.product_type == "com.apple.product-type.framework"
|
44
|
-
pods_target.add_file_references [interface]
|
45
|
-
header_ref = pods_target.headers_build_phase.files[-1]
|
46
|
-
header_ref.settings = { "ATTRIBUTES" => ["Public"] }
|
47
|
-
end
|
48
|
-
|
49
|
-
project.save
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|