pem 0.3.7 → 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -0
- data/bin/pem +5 -41
- data/lib/pem.rb +6 -0
- data/lib/pem/cert_manager.rb +12 -5
- data/lib/pem/developer_center.rb +16 -15
- data/lib/pem/manager.rb +24 -0
- data/lib/pem/options.rb +44 -0
- data/lib/pem/version.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d017f22c946bf5b7edc3f19207fc18f4a7f44d74
|
4
|
+
data.tar.gz: a768d2968115885940b6eae235e986918b4415e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de12a00972b77b529f0636029c919f491607d38b7d65e3781297ae17880390da23e951c3a4b7e12ebfadca519a515474773037d4e56ea917f0696d4582a39ac8
|
7
|
+
data.tar.gz: 8e08fb66e95a7641021a929934c8898a4b45133d485c9f6588b2b5030ad592869dbd68fa0a4fc27f3faa6c92c29f2d4e0682e57ef7f6b71e4a1492152391b871
|
data/README.md
CHANGED
@@ -91,6 +91,11 @@ If you want to generate a development certificate instead:
|
|
91
91
|
|
92
92
|
pem --development
|
93
93
|
|
94
|
+
To get a list of available options run:
|
95
|
+
|
96
|
+
pem --help
|
97
|
+
|
98
|
+
|
94
99
|
##### [Like this tool? Be the first to know about updates and new fastlane tools](https://tinyletter.com/krausefx)
|
95
100
|
|
96
101
|
## Environment Variables
|
data/bin/pem
CHANGED
@@ -6,6 +6,8 @@ require 'pem'
|
|
6
6
|
require 'commander'
|
7
7
|
require 'credentials_manager/password_manager'
|
8
8
|
require 'credentials_manager/appfile_config'
|
9
|
+
require 'pem/options'
|
10
|
+
require 'pem/manager'
|
9
11
|
|
10
12
|
HighLine.track_eof = false
|
11
13
|
|
@@ -22,36 +24,15 @@ class PemApplication
|
|
22
24
|
|
23
25
|
always_trace!
|
24
26
|
|
25
|
-
|
26
|
-
global_option '-u', '--username STRING', 'Your Apple ID username'
|
27
|
-
global_option '-a', '--identifier STRING', String, 'The bundle identifier of your app'
|
27
|
+
FastlaneCore::CommanderGenerator.new.generate(PEM::Options.available_options)
|
28
28
|
|
29
29
|
command :renew do |c|
|
30
30
|
c.syntax = 'pem renew'
|
31
31
|
c.description = 'Renews the certificate (in case it expired) and shows the path to the generated pem file'
|
32
32
|
|
33
33
|
c.action do |args, options|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
path, rsa_file = PEM::CertManager.new.run(app, !options.development)
|
38
|
-
|
39
|
-
if path
|
40
|
-
file_name = File.basename(path)
|
41
|
-
output = "./#{file_name}"
|
42
|
-
FileUtils.mv(path, output)
|
43
|
-
puts output.green
|
44
|
-
end
|
45
|
-
|
46
|
-
if ENV["PEM_SAVE_PRIVATEKEY"]
|
47
|
-
file_name = File.basename(rsa_file)
|
48
|
-
output = "./#{file_name}"
|
49
|
-
FileUtils.mv(rsa_file, output)
|
50
|
-
puts output.green
|
51
|
-
else
|
52
|
-
File.delete(rsa_file)
|
53
|
-
end
|
54
|
-
|
34
|
+
PEM.config = FastlaneCore::Configuration.create(PEM::Options.available_options, options.__hash__)
|
35
|
+
PEM::Manager.start
|
55
36
|
end
|
56
37
|
end
|
57
38
|
|
@@ -59,23 +40,6 @@ class PemApplication
|
|
59
40
|
|
60
41
|
run!
|
61
42
|
end
|
62
|
-
|
63
|
-
def username(options)
|
64
|
-
user = options.username
|
65
|
-
user ||= ENV["PEM_USERNAME"]
|
66
|
-
user ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
|
67
|
-
|
68
|
-
CredentialsManager::PasswordManager.shared_manager(user) if user
|
69
|
-
end
|
70
|
-
|
71
|
-
def app_identifier(options)
|
72
|
-
value = options.identifier
|
73
|
-
value ||= ENV["PEM_APP_IDENTIFIER"]
|
74
|
-
value ||= CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)
|
75
|
-
value ||= ask("App Identifier (Bundle ID, e.g. com.krausefx.app): ")
|
76
|
-
return value
|
77
|
-
end
|
78
|
-
|
79
43
|
end
|
80
44
|
|
81
45
|
PemApplication.new.run
|
data/lib/pem.rb
CHANGED
@@ -7,10 +7,16 @@ require 'pem/signing_request'
|
|
7
7
|
require 'fastlane_core'
|
8
8
|
|
9
9
|
module PEM
|
10
|
+
# Use this to just setup the configuration attribute and set it later somewhere else
|
11
|
+
class << self
|
12
|
+
attr_accessor :config
|
13
|
+
end
|
14
|
+
|
10
15
|
TMP_FOLDER = "/tmp/PEM/"
|
11
16
|
FileUtils.mkdir_p TMP_FOLDER
|
12
17
|
|
13
18
|
ENV['FASTLANE_TEAM_ID'] ||= ENV["PEM_TEAM_ID"]
|
19
|
+
ENV['DELIVER_USER'] ||= ENV["PEM_USERNAME"]
|
14
20
|
|
15
21
|
Helper = FastlaneCore::Helper # you gotta love Ruby: Helper.* should use the Helper class contained in FastlaneCore
|
16
22
|
|
data/lib/pem/cert_manager.rb
CHANGED
@@ -1,26 +1,33 @@
|
|
1
1
|
module PEM
|
2
2
|
class CertManager
|
3
3
|
# Download the cert, do all kinds of Keychain related things
|
4
|
-
def run
|
4
|
+
def run
|
5
5
|
# Keychain (security) documentation: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/security.1.html
|
6
6
|
# Old project, which might be helpful: https://github.com/jprichardson/keychain_manager
|
7
7
|
|
8
|
-
Helper.log.info "Refreshing push notification profiles for app '#{app_identifier}'"
|
8
|
+
Helper.log.info "Refreshing push notification profiles for app '#{PEM.config[:app_identifier]}'"
|
9
9
|
|
10
10
|
dev = PEM::DeveloperCenter.new
|
11
11
|
|
12
|
-
cert_file = dev.fetch_cer_file
|
12
|
+
cert_file = dev.fetch_cer_file
|
13
13
|
rsa_file = File.join(TMP_FOLDER, 'private_key.key')
|
14
14
|
|
15
15
|
pem_temp = File.join(TMP_FOLDER, 'pem_temp.pem')
|
16
16
|
|
17
|
-
certificate_type = (
|
17
|
+
certificate_type = (PEM.config[:development] ? 'development' : 'production')
|
18
18
|
|
19
19
|
|
20
|
-
pem_file = File.join(TMP_FOLDER, "#{certificate_type}_#{app_identifier}.pem")
|
20
|
+
pem_file = File.join(TMP_FOLDER, "#{certificate_type}_#{PEM.config[:app_identifier]}.pem")
|
21
21
|
command("openssl x509 -inform der -in '#{cert_file}' -out #{pem_temp}")
|
22
22
|
content = File.read(pem_temp) + File.read(rsa_file)
|
23
23
|
File.write(pem_file, content)
|
24
|
+
|
25
|
+
# Generate p12 file as well
|
26
|
+
if PEM.config[:generate_p12]
|
27
|
+
output = "#{certificate_type}.p12"
|
28
|
+
command("openssl pkcs12 -export -password pass:"" -in '#{pem_file}' -inkey '#{pem_file}' -out '#{output}'")
|
29
|
+
puts output.green
|
30
|
+
end
|
24
31
|
|
25
32
|
return pem_file, rsa_file
|
26
33
|
end
|
data/lib/pem/developer_center.rb
CHANGED
@@ -8,24 +8,25 @@ module PEM
|
|
8
8
|
# This method will enable push for the given app
|
9
9
|
# and download the cer file in any case, no matter if it existed before or not
|
10
10
|
# @return the path to the push file
|
11
|
-
def fetch_cer_file
|
11
|
+
def fetch_cer_file
|
12
|
+
@app_identifier = PEM.config[:app_identifier]
|
12
13
|
begin
|
13
|
-
open_app_page
|
14
|
+
open_app_page
|
14
15
|
|
15
16
|
click_on "Edit"
|
16
17
|
wait_for_elements(".item-details") # just to finish loading
|
17
18
|
|
18
19
|
push_value = first(:css, '#pushEnabled').value
|
19
20
|
if push_value == "on"
|
20
|
-
Helper.log.info "Push for app '#{app_identifier}' is enabled"
|
21
|
+
Helper.log.info "Push for app '#{@app_identifier}' is enabled"
|
21
22
|
else
|
22
|
-
Helper.log.warn "Push for app '#{app_identifier}' is disabled. This has to change."
|
23
|
+
Helper.log.warn "Push for app '#{@app_identifier}' is disabled. This has to change."
|
23
24
|
first(:css, '#pushEnabled').click
|
24
25
|
sleep 3 # this takes some time
|
25
26
|
end
|
26
27
|
|
27
|
-
Helper.log.warn "Creating push certificate for app '#{app_identifier}'."
|
28
|
-
create_push_for_app
|
28
|
+
Helper.log.warn "Creating push certificate for app '#{@app_identifier}'."
|
29
|
+
create_push_for_app
|
29
30
|
rescue => ex
|
30
31
|
error_occured(ex)
|
31
32
|
end
|
@@ -33,36 +34,36 @@ module PEM
|
|
33
34
|
|
34
35
|
|
35
36
|
private
|
36
|
-
def open_app_page
|
37
|
+
def open_app_page
|
37
38
|
begin
|
38
39
|
visit APP_IDS_URL
|
39
40
|
sleep 5
|
40
41
|
|
41
42
|
wait_for_elements(".toolbar-button.search").first.click
|
42
|
-
fill_in "bundle-list-search", with: app_identifier
|
43
|
+
fill_in "bundle-list-search", with: @app_identifier
|
43
44
|
sleep 5
|
44
45
|
|
45
|
-
apps = all(:xpath, "//td[@title='#{app_identifier}']")
|
46
|
+
apps = all(:xpath, "//td[@title='#{@app_identifier}']")
|
46
47
|
if apps.count == 1
|
47
48
|
apps.first.click
|
48
49
|
sleep 2
|
49
50
|
|
50
51
|
return true
|
51
52
|
else
|
52
|
-
raise DeveloperCenterGeneralError.new("Could not find app with identifier '#{app_identifier}' on apps page. The identifier is case sensitive.")
|
53
|
+
raise DeveloperCenterGeneralError.new("Could not find app with identifier '#{@app_identifier}' on apps page. The identifier is case sensitive.")
|
53
54
|
end
|
54
55
|
rescue => ex
|
55
56
|
error_occured(ex)
|
56
57
|
end
|
57
58
|
end
|
58
59
|
|
59
|
-
def create_push_for_app
|
60
|
+
def create_push_for_app
|
60
61
|
|
61
|
-
element_name = (
|
62
|
+
element_name = (PEM.config[:development] ? '.button.small.navLink.development.enabled' : '.button.small.navLink.distribution.enabled')
|
62
63
|
begin
|
63
64
|
wait_for_elements(element_name).first.click # Create Certificate button
|
64
65
|
rescue
|
65
|
-
raise "Could not create a new push profile for app '#{app_identifier}'. There are already 2 certificates active. Please revoke one to let PEM create a new one\n\n#{current_url}".red
|
66
|
+
raise "Could not create a new push profile for app '#{@app_identifier}'. There are already 2 certificates active. Please revoke one to let PEM create a new one\n\n#{current_url}".red
|
66
67
|
end
|
67
68
|
|
68
69
|
sleep 2
|
@@ -84,7 +85,7 @@ module PEM
|
|
84
85
|
sleep 2
|
85
86
|
end
|
86
87
|
|
87
|
-
certificate_type = (
|
88
|
+
certificate_type = (PEM.config[:development] ? 'development' : 'production')
|
88
89
|
|
89
90
|
# Download the newly created certificate
|
90
91
|
Helper.log.info "Going to download the latest profile"
|
@@ -108,7 +109,7 @@ module PEM
|
|
108
109
|
|
109
110
|
raise "Something went wrong when downloading the certificate" unless data
|
110
111
|
|
111
|
-
path = "#{TMP_FOLDER}aps_#{certificate_type}_#{app_identifier}.cer"
|
112
|
+
path = "#{TMP_FOLDER}aps_#{certificate_type}_#{@app_identifier}.cer"
|
112
113
|
dataWritten = File.write(path, data)
|
113
114
|
|
114
115
|
if dataWritten == 0
|
data/lib/pem/manager.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module PEM
|
2
|
+
# Creates the push profile and stores it in the correct location
|
3
|
+
class Manager
|
4
|
+
def self.start
|
5
|
+
path, rsa_file = PEM::CertManager.new.run
|
6
|
+
|
7
|
+
if path
|
8
|
+
file_name = File.basename(path)
|
9
|
+
output = "./#{file_name}"
|
10
|
+
FileUtils.mv(path, output)
|
11
|
+
puts output.green
|
12
|
+
end
|
13
|
+
|
14
|
+
if PEM.config[:save_private_key]
|
15
|
+
file_name = File.basename(rsa_file)
|
16
|
+
output = "./#{file_name}"
|
17
|
+
FileUtils.mv(rsa_file, output)
|
18
|
+
puts output.green
|
19
|
+
else
|
20
|
+
File.delete(rsa_file)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/pem/options.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'fastlane_core'
|
2
|
+
|
3
|
+
module PEM
|
4
|
+
class Options
|
5
|
+
def self.available_options
|
6
|
+
@@options ||= [
|
7
|
+
FastlaneCore::ConfigItem.new(key: :development,
|
8
|
+
env_name: "PEM_DEVELOPMENT",
|
9
|
+
description: "Renew the development push certificate instead of the production one",
|
10
|
+
is_string: false),
|
11
|
+
FastlaneCore::ConfigItem.new(key: :generate_p12,
|
12
|
+
env_name: "PEM_GENERATE_P12_FILE",
|
13
|
+
description: "Generate a p12 file additionally to a PEM file",
|
14
|
+
is_string: false),
|
15
|
+
FastlaneCore::ConfigItem.new(key: :save_private_key,
|
16
|
+
short_option: "-s",
|
17
|
+
env_name: "PEM_SAVE_PRIVATEKEY",
|
18
|
+
description: "Set to save the private RSA key in the current directory",
|
19
|
+
is_string: false),
|
20
|
+
FastlaneCore::ConfigItem.new(key: :app_identifier,
|
21
|
+
short_option: "-a",
|
22
|
+
env_name: "PEM_APP_IDENTIFIER",
|
23
|
+
description: "The bundle identifier of your app",
|
24
|
+
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)),
|
25
|
+
FastlaneCore::ConfigItem.new(key: :username,
|
26
|
+
short_option: "-u",
|
27
|
+
env_name: "PEM_USERNAME",
|
28
|
+
description: "Your Apple ID Username",
|
29
|
+
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:apple_id),
|
30
|
+
verify_block: Proc.new do |value|
|
31
|
+
CredentialsManager::PasswordManager.shared_manager(value)
|
32
|
+
end),
|
33
|
+
FastlaneCore::ConfigItem.new(key: :team_id,
|
34
|
+
short_option: "-t",
|
35
|
+
env_name: "PEM_TEAM_ID",
|
36
|
+
description: "The ID of your team if you're in multiple teams",
|
37
|
+
optional: true,
|
38
|
+
verify_block: Proc.new do |value|
|
39
|
+
ENV["FASTLANE_TEAM_ID"] = value
|
40
|
+
end),
|
41
|
+
]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
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.3.
|
4
|
+
version: 0.3.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fastlane_core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.3.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.3.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,6 +137,8 @@ files:
|
|
137
137
|
- lib/pem/cert_manager.rb
|
138
138
|
- lib/pem/dependency_checker.rb
|
139
139
|
- lib/pem/developer_center.rb
|
140
|
+
- lib/pem/manager.rb
|
141
|
+
- lib/pem/options.rb
|
140
142
|
- lib/pem/signing_request.rb
|
141
143
|
- lib/pem/version.rb
|
142
144
|
homepage: https://fastlane.tools
|