keychain_osx 0.0.1
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 +7 -0
- data/lib/keychain_osx/command.rb +15 -0
- data/lib/keychain_osx/keychain.rb +74 -0
- data/lib/keychain_osx/provisioningprofile.rb +108 -0
- data/lib/keychain_osx.rb +3 -0
- metadata +47 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a29289175bbb0064b44b0e51ab1d42569e3cf82a
|
4
|
+
data.tar.gz: 929558223113fcd97cb8b8001616814e6ab76e74
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9680d174434d0c49d2259cd86c08af5bed0088d16ac34bafb17ca46f735f40b4d663a66e73d70c8de198a8df09e01c6c89d13e5df1931748709dc74c6e70053b
|
7
|
+
data.tar.gz: a3a0d36ae49e2de25517f7fcac61507534d7d2c6ac8e4c31f85ad402eb42d383b08e61b5462fe233ba06dc50ba3cb3e5a697c1a498f2495ed22bc0df74aa8e42
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module OSX
|
2
|
+
|
3
|
+
module Command
|
4
|
+
def self.run(*cmd, &block)
|
5
|
+
unless block_given?
|
6
|
+
block = lambda { |ok, status|
|
7
|
+
ok or fail "Command failed with status (#{status.exitstatus}): [#{cmd.join(" ")}]"
|
8
|
+
}
|
9
|
+
end
|
10
|
+
puts cmd
|
11
|
+
res = system(*cmd)
|
12
|
+
block.call(res, $?)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
KEYCHAIN_LOCATION = "/tmp/temp_keychain#{Time.now.to_i}.keychain"
|
2
|
+
TEMP_PASSWORD = "keychain_password"
|
3
|
+
|
4
|
+
module OSX
|
5
|
+
|
6
|
+
class Keychain
|
7
|
+
|
8
|
+
attr_accessor :keychain_path
|
9
|
+
|
10
|
+
def initialize(keychain_path, key_password)
|
11
|
+
@keychain_path = keychain_path
|
12
|
+
create(key_password)
|
13
|
+
unlock(key_password)
|
14
|
+
add_to_search_path
|
15
|
+
end
|
16
|
+
|
17
|
+
def unlock(password)
|
18
|
+
command = "security unlock-keychain -p #{password} \"#{@keychain_path}\""
|
19
|
+
OSX::Command::run(command)
|
20
|
+
end
|
21
|
+
|
22
|
+
def import(cert, password)
|
23
|
+
command = "security import '#{cert}' -k \"#{@keychain_path}\" -P #{password} -T /usr/bin/codesign"
|
24
|
+
OSX::Command::run(command)
|
25
|
+
end
|
26
|
+
|
27
|
+
def delete
|
28
|
+
command = "security delete-keychain #{@keychain_path}"
|
29
|
+
OSX::Command::run(command)
|
30
|
+
end
|
31
|
+
|
32
|
+
def set_default
|
33
|
+
command = "security default-keychain -s #{@keychain_path}"
|
34
|
+
OSX::Command::run(command)
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_to_search_path
|
38
|
+
keychains = []
|
39
|
+
|
40
|
+
`security list-keychain`.split.map do |keychain|
|
41
|
+
keychains << keychain.strip.gsub(/\"/,'')
|
42
|
+
end
|
43
|
+
|
44
|
+
keychains << @keychain_path
|
45
|
+
|
46
|
+
command = "security list-keychain -s #{keychains.join(' ')}"
|
47
|
+
OSX::Command::run(command)
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.temp(&block)
|
51
|
+
kc = OSX::Keychain.new(KEYCHAIN_LOCATION, TEMP_PASSWORD)
|
52
|
+
kc.unlock(TEMP_PASSWORD)
|
53
|
+
|
54
|
+
if block_given? # block is given
|
55
|
+
begin
|
56
|
+
yield(kc)
|
57
|
+
ensure
|
58
|
+
kc.delete
|
59
|
+
end
|
60
|
+
else
|
61
|
+
kc.delete
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
def create(key_password, timeout = 600)
|
67
|
+
command = "security create-keychain -p #{key_password} \"#{@keychain_path}\""
|
68
|
+
OSX::Command::run(command)
|
69
|
+
|
70
|
+
command = "security set-keychain-settings -u \"#{@keychain_path}\""
|
71
|
+
OSX::Command::run(command)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module OSX
|
4
|
+
|
5
|
+
class ProvisioningProfile
|
6
|
+
attr_reader :path, :name, :uuid, :identifiers, :devices, :appstore
|
7
|
+
|
8
|
+
def initialize(path)
|
9
|
+
|
10
|
+
raise "Provisioning profile '#{path}' does not exist" unless File.exists? path
|
11
|
+
|
12
|
+
@path = path
|
13
|
+
@identifiers = []
|
14
|
+
@devices = []
|
15
|
+
@appstore = true
|
16
|
+
@enterprise = false
|
17
|
+
|
18
|
+
uuid = nil
|
19
|
+
find_profile_uuid(path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def find_profile_uuid(path)
|
23
|
+
File.open(path, "rb") do |f|
|
24
|
+
input = f.read
|
25
|
+
|
26
|
+
if input=~/ProvisionedDevices/
|
27
|
+
@appstore = false
|
28
|
+
end
|
29
|
+
|
30
|
+
if input=~/<key>ProvisionsAllDevices<\/key>/
|
31
|
+
@enterprise = true
|
32
|
+
end
|
33
|
+
|
34
|
+
if input=~/<key>ProvisionedDevices<\/key>.*?<array>(.*?)<\/array>/im
|
35
|
+
$1.split(/<string>/).each do |id|
|
36
|
+
next if id.nil? or id.strip==""
|
37
|
+
@devices << id.gsub(/<\/string>/,'').strip
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
input=~/<key>UUID<\/key>.*?<string>(.*?)<\/string>/im
|
42
|
+
@uuid = $1.strip
|
43
|
+
|
44
|
+
input=~/<key>Name<\/key>.*?<string>(.*?)<\/string>/im
|
45
|
+
@name = $1.strip
|
46
|
+
|
47
|
+
input=~/<key>ApplicationIdentifierPrefix<\/key>.*?<array>(.*?)<\/array>/im
|
48
|
+
$1.split(/<string>/).each do |id|
|
49
|
+
next if id.nil? or id.strip==""
|
50
|
+
@identifiers << id.gsub(/<\/string>/,'').strip
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def appstore?
|
56
|
+
@appstore
|
57
|
+
end
|
58
|
+
|
59
|
+
def enterprise?
|
60
|
+
@enterprise
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.profiles_path
|
64
|
+
File.expand_path "~/Library/MobileDevice/Provisioning\ Profiles/"
|
65
|
+
end
|
66
|
+
|
67
|
+
def install_path
|
68
|
+
"#{ProvisioningProfile.profiles_path}/#{self.uuid}.mobileprovision"
|
69
|
+
end
|
70
|
+
|
71
|
+
def install
|
72
|
+
# Do not reinstall if profile is same and is already installed
|
73
|
+
return if (self.path == self.install_path.gsub(/\\ /, ' '))
|
74
|
+
|
75
|
+
ProvisioningProfile.installed_profiles.each do |installed|
|
76
|
+
if installed.identifiers==self.identifiers and installed.uuid==self.uuid
|
77
|
+
installed.uninstall
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
FileUtils.mkdir_p(File.dirname(self.install_path))
|
82
|
+
FileUtils.cp(self.path, self.install_path)
|
83
|
+
end
|
84
|
+
|
85
|
+
def uninstall
|
86
|
+
command = "rm -f #{self.install_path}"
|
87
|
+
OSX::Command::run(command)
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.installed_profiles
|
91
|
+
Dir["#{self.profiles_path}/*.mobileprovision"].map do |file|
|
92
|
+
ProvisioningProfile.new(file)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.find_installed_by_uuid uuid
|
97
|
+
ProvisioningProfile.installed_profiles.each do |p|
|
98
|
+
return p if p.uuid == uuid
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.installed_profile(name)
|
103
|
+
self.installed_profiles.select {|p| p.name == name.to_s}.first;
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
data/lib/keychain_osx.rb
ADDED
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: keychain_osx
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Griffiths
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-07-21 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
- Christopher_Griffiths@hotmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/keychain_osx.rb
|
21
|
+
- lib/keychain_osx/command.rb
|
22
|
+
- lib/keychain_osx/keychain.rb
|
23
|
+
- lib/keychain_osx/provisioningprofile.rb
|
24
|
+
homepage: https://github.com/ChrisGriffiths/keychain_osx.git
|
25
|
+
licenses: []
|
26
|
+
metadata: {}
|
27
|
+
post_install_message:
|
28
|
+
rdoc_options: []
|
29
|
+
require_paths:
|
30
|
+
- lib
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
requirements: []
|
42
|
+
rubyforge_project:
|
43
|
+
rubygems_version: 2.2.2
|
44
|
+
signing_key:
|
45
|
+
specification_version: 4
|
46
|
+
summary: A ruby wrapper to add Certificates to a temporary keychain
|
47
|
+
test_files: []
|