pem 0.3.7 → 0.3.8
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 +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
|