pem 0.1.4 → 0.2.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/README.md +8 -7
- data/lib/pem/cert_manager.rb +9 -22
- data/lib/pem/developer_center.rb +26 -28
- data/lib/pem/signing_request.rb +3 -10
- data/lib/pem/version.rb +1 -1
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b953613039c526d03c52b0341dfbd8b235302e7d
|
4
|
+
data.tar.gz: 24327d42b6d028ce77a15fcefcdbb2e8dad66751
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d4de449003920eb1594f7fc546ba97c793a26b1768e3829863e69811d1a1e02e726aa77def4f6599fff9cac8c5ab6dbc7370b9516a9181dc7279a92cd4242ef
|
7
|
+
data.tar.gz: 5d436da8f8de0a09a673cf187f201b8e09200211e4dd6ef63aad7cba961949dd073e9a3f0ca1c46c1913689a9a32abf37d764ed203cb53cff940a576420a9370
|
data/README.md
CHANGED
@@ -29,12 +29,14 @@ Alexander Schuch ([@schuchalexander](https://twitter.com/schuchalexander)) who a
|
|
29
29
|
|
30
30
|
|
31
31
|
-------
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
32
|
+
<p align="center">
|
33
|
+
<a href="#features">Features</a> •
|
34
|
+
<a href="#installation">Installation</a> •
|
35
|
+
<a href="#usage">Usage</a> •
|
36
|
+
<a href="#how-does-it-work">How does it work?</a> •
|
37
|
+
<a href="#tips">Tips</a> •
|
38
|
+
<a href="#need-help">Need help?</a>
|
39
|
+
</p>
|
38
40
|
|
39
41
|
-------
|
40
42
|
|
@@ -84,7 +86,6 @@ In case you prefer environment variables:
|
|
84
86
|
|
85
87
|
- ```PEM_USERNAME```
|
86
88
|
- ```PEM_APP_IDENTIFIER```
|
87
|
-
- ```PEM_CERT_SIGNING_REQUEST``` in case you want to pass your own signing request file
|
88
89
|
|
89
90
|
# How does it work?
|
90
91
|
There are 2 actions involved:
|
data/lib/pem/cert_manager.rb
CHANGED
@@ -9,34 +9,21 @@ module PEM
|
|
9
9
|
|
10
10
|
dev = PEM::DeveloperCenter.new
|
11
11
|
|
12
|
-
keychain = "PEM.keychain"
|
13
|
-
|
14
12
|
cert_file = dev.fetch_cer_file(app_identifier, production)
|
15
|
-
rsa_file =
|
16
|
-
|
17
|
-
previous_keychain = command("security default-keychain")
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
command("security create-keychain -p '' #{keychain}") # create a new keychain for this type
|
13
|
+
rsa_file = File.join(TMP_FOLDER, 'private_key.key')
|
22
14
|
|
23
|
-
|
24
|
-
|
25
|
-
command("openssl genrsa -out '#{rsa_file}' 2048") # generate a new RSA file
|
26
|
-
command("security import '#{rsa_file}' -P '' -k #{keychain}") # import the RSA file into the Keychain
|
27
|
-
command("security import '#{cert_file}' -k #{keychain}") # import the profile from Apple into the Keychain
|
28
|
-
|
29
|
-
p12_file = [TMP_FOLDER, "push_prod.12"].join('/')
|
30
|
-
|
31
|
-
command("security export -k '#{keychain}' -t all -f pkcs12 -P '' -o #{p12_file}") # export code signing identity
|
15
|
+
pem_temp = File.join(TMP_FOLDER, 'pem_temp.pem')
|
32
16
|
|
33
17
|
certificate_type = (production ? 'production' : 'development')
|
34
|
-
pem_file = [TMP_FOLDER, "#{certificate_type}_#{app_identifier}.pem"].join('')
|
35
|
-
command("openssl pkcs12 -passin pass: -nodes -in #{p12_file} -out #{pem_file}")
|
36
18
|
|
37
|
-
command("security delete-keychain #{keychain}")
|
38
19
|
|
39
|
-
|
20
|
+
pem_file = File.join(TMP_FOLDER, "#{certificate_type}_#{app_identifier}.pem")
|
21
|
+
command("openssl x509 -inform der -in '#{cert_file}' -out #{pem_temp}")
|
22
|
+
content = File.read(pem_temp) + File.read(rsa_file)
|
23
|
+
File.write(pem_file, content)
|
24
|
+
|
25
|
+
|
26
|
+
File.delete(rsa_file)
|
40
27
|
|
41
28
|
return pem_file
|
42
29
|
end
|
data/lib/pem/developer_center.rb
CHANGED
@@ -179,33 +179,9 @@ module PEM
|
|
179
179
|
if not download_button
|
180
180
|
Helper.log.warn "Push for app '#{app_identifier}' is enabled, but there is no #{certificate_type} certificate yet."
|
181
181
|
create_push_for_app(app_identifier, production)
|
182
|
-
|
183
|
-
|
184
|
-
raise "Could not find download button for #{section_title}. Check out: '#{current_url}'" unless download_button
|
182
|
+
else
|
183
|
+
raise "Could not create a new push profile for app '#{app_identifier}'. There is already a profile active.".red
|
185
184
|
end
|
186
|
-
|
187
|
-
|
188
|
-
Helper.log.info "Going to download the latest profile"
|
189
|
-
|
190
|
-
# It is enabled, now just download it
|
191
|
-
# Taken from http://stackoverflow.com/a/17111206/445598
|
192
|
-
sleep 2
|
193
|
-
|
194
|
-
host = Capybara.current_session.current_host
|
195
|
-
url = download_button['href']
|
196
|
-
url = [host, url].join('')
|
197
|
-
|
198
|
-
myacinfo = page.driver.cookies['myacinfo'].value # some magic Apple, which is required for the profile download
|
199
|
-
data = open(url, {'Cookie' => "myacinfo=#{myacinfo}"}).read
|
200
|
-
|
201
|
-
raise "Something went wrong when downloading the certificate" unless data
|
202
|
-
|
203
|
-
path = "#{TMP_FOLDER}/aps_#{certificate_type}_#{app_identifier}.cer"
|
204
|
-
File.write(path, data)
|
205
|
-
|
206
|
-
Helper.log.info "Successfully downloaded latest .cer file."
|
207
|
-
return path
|
208
|
-
|
209
185
|
rescue Exception => ex
|
210
186
|
error_occured(ex)
|
211
187
|
end
|
@@ -252,8 +228,30 @@ module PEM
|
|
252
228
|
sleep 2
|
253
229
|
end
|
254
230
|
|
255
|
-
|
256
|
-
|
231
|
+
certificate_type = (production ? 'production' : 'development')
|
232
|
+
|
233
|
+
# Download the newly created certificate
|
234
|
+
Helper.log.info "Going to download the latest profile"
|
235
|
+
|
236
|
+
# It is enabled, now just download it
|
237
|
+
sleep 2
|
238
|
+
|
239
|
+
download_button = first(".button.small.blue")
|
240
|
+
host = Capybara.current_session.current_host
|
241
|
+
url = download_button['href']
|
242
|
+
url = [host, url].join('')
|
243
|
+
puts url
|
244
|
+
|
245
|
+
myacinfo = page.driver.cookies['myacinfo'].value # some magic Apple, which is required for the profile download
|
246
|
+
data = open(url, {'Cookie' => "myacinfo=#{myacinfo}"}).read
|
247
|
+
|
248
|
+
raise "Something went wrong when downloading the certificate" unless data
|
249
|
+
|
250
|
+
path = "#{TMP_FOLDER}/aps_#{certificate_type}_#{app_identifier}.cer"
|
251
|
+
File.write(path, data)
|
252
|
+
|
253
|
+
Helper.log.info "Successfully downloaded latest .cer file."
|
254
|
+
return path
|
257
255
|
end
|
258
256
|
|
259
257
|
|
data/lib/pem/signing_request.rb
CHANGED
@@ -1,16 +1,7 @@
|
|
1
1
|
module PEM
|
2
2
|
class SigningRequest
|
3
3
|
def self.get_path
|
4
|
-
|
5
|
-
|
6
|
-
# Check if there is one in the current directory
|
7
|
-
files = Dir["./*.certSigningRequest"]
|
8
|
-
if files.count == 1
|
9
|
-
Helper.log.info "Found a .certSigningRequest at the current folder. Using that."
|
10
|
-
return files.first
|
11
|
-
end
|
12
|
-
|
13
|
-
return self.generate
|
4
|
+
self.generate
|
14
5
|
end
|
15
6
|
|
16
7
|
def self.generate
|
@@ -28,6 +19,8 @@ module PEM
|
|
28
19
|
|
29
20
|
path = File.join(TMP_FOLDER, 'PEMCertificateSigningRequest.certSigningRequest')
|
30
21
|
File.write(path, csr.to_pem)
|
22
|
+
File.write(File.join(TMP_FOLDER, 'private_key.key'), @key)
|
23
|
+
|
31
24
|
Helper.log.info "Successfully generated .certSigningRequest at path '#{path}'"
|
32
25
|
return path
|
33
26
|
end
|
data/lib/pem/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pem
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: security
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 0.1.3
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 0.1.3
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: highline
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|