sigh 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b5999ae3911bed107f327d8beef03e61407c6493
4
- data.tar.gz: 04564599bd5c894b8e63fbcda115b7fc3473c068
3
+ metadata.gz: 1f42e282f190c126b2e2698b8294f64ead5b52ba
4
+ data.tar.gz: 77fc2e97b0a314183bd0cfdc7ba537f866dfbe01
5
5
  SHA512:
6
- metadata.gz: 54981675f063943ed973b25392e5a8717094573e19e70753af97b736e36c223134e72fb7b3787cbc65d67fa478eb9a9af75df4840f1727f978091ba9e1faa5f6
7
- data.tar.gz: afaffef16c71115c3fd0a3202807c76e7a245522d90505981c3041b077cd157fb2dbe2e77fdcee6ff1cf4813838d249a88c01756019a7fb553e1ea54d72ae064
6
+ metadata.gz: b2b4dff8c89d996764cb0a28f105c6a4f48c91a2b78b1307463b21842a4b0b7bb895ed1a9a660573733118d3cfe28e767cfb3d21e8d4e54cd744587a0a2c4322
7
+ data.tar.gz: e6fcf9e4b4a32d8e0905ad46a844c150c3387e8b6449d8491ab8314d4d53bce796adb07a40345468f57fbe62ddab052aaafff889ac9ae64050914d8b24d55c4b
data/README.md CHANGED
@@ -11,7 +11,8 @@
11
11
  <a href="https://github.com/KrauseFx/frameit">frameit</a> &bull;
12
12
  <a href="https://github.com/KrauseFx/PEM">PEM</a> &bull;
13
13
  <b>sigh</b> &bull;
14
- <a href="https://github.com/KrauseFx/produce">produce</a>
14
+ <a href="https://github.com/KrauseFx/produce">produce</a> &bull;
15
+ <a href="https://github.com/KrauseFx/cert">cert</a>
15
16
  </p>
16
17
  -------
17
18
 
@@ -116,9 +117,9 @@ To save the provisioning profile under a specific name, use the -f option:
116
117
 
117
118
  sigh -a com.krausefx.app -u username -f "myProfile.mobileprovision"
118
119
 
119
- If you need the provisioning profile to be renewed regardless of its state use the `--force` option. This gives you a profile with the maximum lifetime:
120
+ If you need the provisioning profile to be renewed regardless of its state use the `--force` option. This gives you a profile with the maximum lifetime. `--force` will also add all available devices to this profile.
120
121
 
121
- sigh --force -a com.krausefx.app -u username
122
+ sigh --force
122
123
 
123
124
  By default, ```sigh``` will include all certificates on development profiles, and first certificate on other types. If you need to specify which certificate to use you can either use the environment variable `SIGH_CERTIFICATE`, or pass the name or expiry date of the certificate as argument:
124
125
 
@@ -144,12 +145,19 @@ You can pass more information using the command line:
144
145
  ## Environment Variables
145
146
  In case you prefer environment variables:
146
147
 
147
- - ```SIGH_USERNAME```
148
- - ```SIGH_APP_IDENTIFIER```
149
- - ```SIGH_CERTIFICATE``` (The name of the certificate to use)
150
- - ```SIGH_TEAM_ID``` (The Team ID, e.g. `Q2CBPK58CA`)
148
+ - `SIGH_USERNAME`
149
+ - `SIGH_APP_IDENTIFIER`
150
+ - `SIGH_TEAM_ID` (The Team ID, e.g. `Q2CBPK58CA`)
151
151
  - `SIGH_DISABLE_OPEN_ERROR` - in case of error, `sigh` won't open Preview with a screenshot of the error when this variable is set.
152
152
 
153
+ Choose signing certificate to use:
154
+
155
+ - `SIGH_CERTIFICATE` (The name of the certificate to use)
156
+ - `SIGH_CERTIFICATE_ID` (The ID of the certificate)
157
+ - `SIGH_CERTIFICATE_EXPIRE_DATE` (The expire date of the certificate)
158
+
159
+ If you're using [cert](https://github.com/KrauseFx/cert) in combination with [fastlane](https://github.com/KrauseFx/fastlane) the signing certificate will automatically be selected for you.
160
+
153
161
  # How does it work?
154
162
 
155
163
  ```sigh``` will access the ```iOS Dev Center``` to download, renew or generate the ```.mobileprovision``` file. Check out the full source code: [developer_center.rb](https://github.com/KrauseFx/sigh/blob/master/lib/sigh/developer_center.rb).
@@ -167,6 +175,7 @@ In case you prefer environment variables:
167
175
  - [`frameit`](https://github.com/KrauseFx/frameit): Quickly put your screenshots into the right device frames
168
176
  - [`PEM`](https://github.com/KrauseFx/pem): Automatically generate and renew your push notification profiles
169
177
  - [`produce`](https://github.com/KrauseFx/produce): Create new iOS apps on iTunes Connect and Dev Portal using the command line
178
+ - [`cert`](https://github.com/KrauseFx/cert): Automatically create and maintain iOS code signing certificates
170
179
 
171
180
  ## Use the 'Provisioning Quicklook plugin'
172
181
  Download and install the [Provisioning Plugin](https://github.com/chockenberry/Provisioning).
data/bin/sigh CHANGED
@@ -48,8 +48,9 @@ class SighApplication
48
48
  type = FastlaneCore::DeveloperCenter::DEVELOPMENT if options.development
49
49
 
50
50
  ENV['SIGH_CERTIFICATE'] = options.cert_owner if options.cert_owner
51
+ ENV['SIGH_CERTIFICATE_EXPIRE_DATE'] = options.cert_date if options.cert_date
51
52
 
52
- path = FastlaneCore::DeveloperCenter.new.run(app, type, options.cert_name, options.force, options.cert_date)
53
+ path = FastlaneCore::DeveloperCenter.new.run(app, type, options.cert_name, options.force)
53
54
 
54
55
  if path
55
56
  file_name = options.filename || File.basename(path)
@@ -1,4 +1,5 @@
1
1
  require 'fastlane_core/developer_center/developer_center'
2
+ require 'sigh/developer_center_signing'
2
3
 
3
4
  module FastlaneCore
4
5
  class DeveloperCenter
@@ -10,8 +11,8 @@ module FastlaneCore
10
11
  PROFILES_URL_DEV = "https://developer.apple.com/account/ios/profile/profileList.action?type=limited"
11
12
 
12
13
 
13
- def run(app_identifier, type, cert_name = nil, force = false, cert_date = nil)
14
- cert = maintain_app_certificate(app_identifier, type, force, cert_date)
14
+ def run(app_identifier, type, cert_name = nil, force = false)
15
+ cert = maintain_app_certificate(app_identifier, type, force)
15
16
 
16
17
  type_name = type
17
18
  type_name = "Distribution" if type == APPSTORE # both enterprise and App Store
@@ -24,7 +25,7 @@ module FastlaneCore
24
25
  return output_path
25
26
  end
26
27
 
27
- def maintain_app_certificate(app_identifier, type, force, cert_date)
28
+ def maintain_app_certificate(app_identifier, type, force)
28
29
  begin
29
30
  if type == DEVELOPMENT
30
31
  visit PROFILES_URL_DEV
@@ -55,13 +56,13 @@ module FastlaneCore
55
56
  # We found the correct certificate
56
57
  if force && type != DEVELOPMENT
57
58
  provisioningProfileId = current_cert['provisioningProfileId']
58
- renew_profile(provisioningProfileId, type, cert_date) # This one needs to be forcefully renewed
59
- return maintain_app_certificate(app_identifier, type, false, cert_date) # recursive
59
+ renew_profile(provisioningProfileId, type) # This one needs to be forcefully renewed
60
+ return maintain_app_certificate(app_identifier, type, false) # recursive
60
61
  elsif current_cert['status'] == 'Active'
61
62
  return download_profile(details['provisioningProfile']['provisioningProfileId']) # this one is already finished. Just download it.
62
63
  elsif ['Expired', 'Invalid'].include? current_cert['status']
63
- renew_profile(current_cert['provisioningProfileId'], type, cert_date) # This one needs to be renewed
64
- return maintain_app_certificate(app_identifier, type, false, cert_date) # recursive
64
+ renew_profile(current_cert['provisioningProfileId'], type) # This one needs to be renewed
65
+ return maintain_app_certificate(app_identifier, type, false) # recursive
65
66
  end
66
67
 
67
68
  break
@@ -70,18 +71,18 @@ module FastlaneCore
70
71
 
71
72
  Helper.log.info "Could not find existing profile. Trying to create a new one."
72
73
  # Certificate does not exist yet, we need to create a new one
73
- create_profile(app_identifier, type, cert_date)
74
+ create_profile(app_identifier, type)
74
75
  # After creating the profile, we need to download it
75
- return maintain_app_certificate(app_identifier, type, false, cert_date) # recursive
76
+ return maintain_app_certificate(app_identifier, type, false) # recursive
76
77
 
77
78
  rescue => ex
78
79
  error_occured(ex)
79
80
  end
80
81
  end
81
82
 
82
- def create_profile(app_identifier, type, cert_date)
83
+ def create_profile(app_identifier, type)
83
84
  Helper.log.info "Creating new profile for app '#{app_identifier}' for type '#{type}'.".yellow
84
- certificates = code_signing_certificates(type, cert_date)
85
+ certificates = code_signing_certificates(type)
85
86
 
86
87
  create_url = "https://developer.apple.com/account/ios/profile/profileCreate.action"
87
88
  visit create_url
@@ -164,8 +165,8 @@ module FastlaneCore
164
165
  wait_for_elements('.row-details')
165
166
  end
166
167
 
167
- def renew_profile(profile_id, type, cert_date)
168
- certificate = code_signing_certificates(type, cert_date).first
168
+ def renew_profile(profile_id, type)
169
+ certificate = code_signing_certificates(type).first
169
170
 
170
171
  details_url = "https://developer.apple.com/account/ios/profile/profileEdit.action?type=&provisioningProfileId=#{profile_id}"
171
172
  Helper.log.info "Renewing provisioning profile '#{profile_id}' using URL '#{details_url}'"
@@ -177,6 +178,14 @@ module FastlaneCore
177
178
  certs = all(:xpath, "//input[@type='radio' and @value='#{certificate["certificateId"]}']")
178
179
  if certs.count == 1
179
180
  certs.first.click
181
+
182
+ if type != APPSTORE
183
+ # Add all devices
184
+ wait_for_elements('.selectAll.column')
185
+ sleep 3
186
+ first(:xpath, "//div[@class='selectAll column']/input").click # select all the devices
187
+ end
188
+
180
189
  click_next
181
190
 
182
191
  wait_for_elements('.row-details')
@@ -0,0 +1,88 @@
1
+ module FastlaneCore
2
+ class DeveloperCenter
3
+ # Returns a array of hashes, that contains information about the iOS certificate
4
+ # @example
5
+ # [{"certRequestId"=>"B23Q2P396B",
6
+ # "name"=>"SunApps GmbH",
7
+ # "statusString"=>"Issued",
8
+ # "expirationDate"=>"2015-11-25T22:45:50Z",
9
+ # "expirationDateString"=>"Nov 25, 2015",
10
+ # "ownerType"=>"team",
11
+ # "ownerName"=>"SunApps GmbH",
12
+ # "ownerId"=>"....",
13
+ # "canDownload"=>true,
14
+ # "canRevoke"=>true,
15
+ # "certificateId"=>"....",
16
+ # "certificateStatusCode"=>0,
17
+ # "certRequestStatusCode"=>4,
18
+ # "certificateTypeDisplayId"=>"...",
19
+ # "serialNum"=>"....",
20
+ # "typeString"=>"iOS Distribution"},
21
+ # {another sertificate...}]
22
+ def code_signing_certificates(type)
23
+ certs_url = "https://developer.apple.com/account/ios/certificate/certificateList.action?type="
24
+ certs_url << (type == DEVELOPMENT ? 'development' : 'distribution')
25
+ visit certs_url
26
+
27
+ certificateDataURL = wait_for_variable('certificateDataURL')
28
+ certificateRequestTypes = wait_for_variable('certificateRequestTypes')
29
+ certificateStatuses = wait_for_variable('certificateStatuses')
30
+
31
+ url = [certificateDataURL, certificateRequestTypes, certificateStatuses].join('')
32
+
33
+ # https://developer.apple.com/services-account/.../account/ios/certificate/listCertRequests.action?content-type=application/x-www-form-urlencoded&accept=application/json&requestId=...&userLocale=en_US&teamId=...&types=...&status=4&certificateStatus=0&type=distribution
34
+
35
+ certs = post_ajax(url)['certRequests']
36
+
37
+ ret_certs = []
38
+
39
+ # Select certificate
40
+ certificate_name = ENV['SIGH_CERTIFICATE']
41
+ cert_date = ENV['SIGH_CERTIFICATE_EXPIRE_DATE']
42
+ cert_id = ENV['SIGH_CERTIFICATE_ID']
43
+
44
+ # The other profiles are push profiles
45
+ certificate_type = type == DEVELOPMENT ? 'iOS Development' : 'iOS Distribution'
46
+
47
+ # New profiles first
48
+ certs.sort! do |a, b|
49
+ Time.parse(b['expirationDate']) <=> Time.parse(a['expirationDate'])
50
+ end
51
+
52
+ certs.each do |current_cert|
53
+ next unless current_cert['typeString'] == certificate_type
54
+
55
+ if cert_date || certificate_name || cert_id
56
+ if current_cert['expirationDateString'] == cert_date
57
+ Helper.log.info "Certificate ID '#{current_cert['certificateId']}' with expiry date '#{current_cert['expirationDateString']}' located".green
58
+ ret_certs << current_cert
59
+ end
60
+
61
+ if current_cert['name'] == certificate_name
62
+ Helper.log.info "Certificate ID '#{current_cert['certificateId']}' with name '#{certificate_name}' located".green
63
+ ret_certs << current_cert
64
+ end
65
+
66
+ if current_cert['certificateId'] == cert_id
67
+ Helper.log.info "Certificate ID '#{current_cert['certificateId']}' with name '#{current_cert['name']}' located".green
68
+ ret_certs << current_cert
69
+ end
70
+ else
71
+ ret_certs << current_cert
72
+ end
73
+ end
74
+
75
+ return ret_certs unless ret_certs.empty?
76
+
77
+ predicates = []
78
+ predicates << "name: #{certificate_name}" if certificate_name
79
+ predicates << "expiry date: #{cert_date}" if cert_date
80
+ predicates << "certificate ID: #{cert_id}" if cert_id
81
+ predicates << "type: #{(type == DEVELOPMENT ? 'development' : 'distribution')}"
82
+
83
+ predicates_str = " with #{predicates.join(', ')}"
84
+
85
+ raise "Could not find a Certificate#{predicates_str}. Please open #{current_url} and make sure you have a signing profile created, which mathces the given filters".red
86
+ end
87
+ end
88
+ end
data/lib/sigh/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sigh
2
- VERSION = "0.3.3"
2
+ VERSION = "0.3.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sigh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
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-02-18 00:00:00.000000000 Z
11
+ date: 2015-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fastlane_core
@@ -138,6 +138,7 @@ files:
138
138
  - lib/sigh.rb
139
139
  - lib/sigh/dependency_checker.rb
140
140
  - lib/sigh/developer_center.rb
141
+ - lib/sigh/developer_center_signing.rb
141
142
  - lib/sigh/resign.rb
142
143
  - lib/sigh/version.rb
143
144
  homepage: http://fastlane.tools