omudid 1.0.6 → 1.0.7

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.
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.8.7"
4
+ - "1.9.2"
5
+ - "1.9.3"
data/Gemfile CHANGED
@@ -1,8 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'cupertino'
4
- gem 'spinning_cursor'
5
- gem 'rainbow'
6
-
7
3
  # Specify your gem's dependencies in omudid.gemspec
8
4
  gemspec
data/README.md CHANGED
@@ -5,6 +5,8 @@ Conveniently add a UDID to the iOS Developer Portal, refresh a provisioning prof
5
5
 
6
6
  Uploading a new provisioning profile to TestFlight is also supported.
7
7
 
8
+ [![Build Status](https://travis-ci.org/Papercloud/OneMoreUDID.png)](https://travis-ci.org/Papercloud/OneMoreUDID)
9
+
8
10
  Installation
9
11
  -
10
12
  ```
@@ -107,4 +109,5 @@ Note: you can repeat this process by running:
107
109
 
108
110
  Loading page... done
109
111
  Submitted ~/Library/MobileDevice/Provisioning Profiles/demo1.mobileprovision
112
+ Share link: http://testflightapp.com/install/XYZ/
110
113
  ```
data/Rakefile CHANGED
@@ -1 +1,9 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'test'
6
+ end
7
+
8
+ desc "Run tests"
9
+ task :default => :test
data/bin/omudid CHANGED
@@ -13,7 +13,7 @@ require 'cupertino_compatibility'
13
13
  require 'shellwords'
14
14
 
15
15
  program :name, 'OneMoreUDID'
16
- program :version, OneMoreUDID::VERSION
16
+ program :version, "1.0.7"
17
17
  program :description, '''Uses the developer portal to add one device to a provisioning profile,
18
18
  then downloads and installs the new profile.
19
19
  Also uploads provisioning profiles to TestFlight.'''
@@ -28,19 +28,19 @@ command :'list-teams' do |c|
28
28
  c.description = ''
29
29
 
30
30
  c.action do |args, options|
31
- username = (args[0] or ask 'Apple Username:')
32
- password = (args[1] or pw 'Apple Password:')
31
+ agent = OneMoreUDID::PortalAgent.new
32
+
33
+ username, password = (args[0] rescue nil), (args[1] rescue nil)
34
+ username, password = agent.login(username, password)
33
35
 
34
36
  if !args[1]
35
37
  puts
36
- say_warning 'Note: you can repeat this process by running:'
38
+ say_warning 'Note: you can automate this process by running:'
37
39
  say_warning ' omudid list-teams ' + Shellwords.escape(username) + ' [password]'
38
40
  puts
39
41
  end
40
42
 
41
- agent = OneMoreUDID::PortalAgent.new
42
-
43
- teams = agent.get_teams(username, password)
43
+ teams = agent.get_teams()
44
44
 
45
45
  table = Terminal::Table.new do |t|
46
46
  t << ['Team ID', 'Team Name']
@@ -62,23 +62,23 @@ command :'list-profiles' do |c|
62
62
  c.description = ''
63
63
 
64
64
  c.action do |args, options|
65
+ agent = OneMoreUDID::PortalAgent.new
66
+
67
+ username, password = (args[0] rescue nil), (args[1] rescue nil)
68
+ username, password = agent.login(username, password)
65
69
 
66
- username = (args[0] or ask 'Apple Username:')
67
- password = (args[1] or pw 'Apple Password:')
68
70
  team_name = args[2] rescue ''
69
71
 
70
72
  if !args[1]
71
73
  puts
72
74
  end
73
75
 
74
- agent = OneMoreUDID::PortalAgent.new
75
-
76
- agent.setup_cupertino(username, password, team_name)
76
+ agent.setup_cupertino(team_name)
77
77
  profiles = agent.list_profiles()
78
78
 
79
79
  if !args[1]
80
80
  puts
81
- say_warning 'Note: you can repeat this process by running:'
81
+ say_warning 'Note: you can automate this process by running:'
82
82
 
83
83
  if agent.agent.instance_variable_get('@team')
84
84
  say_warning ' omudid list-profiles ' + Shellwords.escape(username) + ' [password] ' + agent.agent.instance_variable_get('@team')
@@ -109,14 +109,19 @@ command :add do |c|
109
109
 
110
110
  c.action do |args, options|
111
111
 
112
- username = (args[0] or ask 'Apple Username:')
113
- password = (args[1] or pw 'Apple Password:')
112
+ agent = OneMoreUDID::PortalAgent.new
113
+ username, password = (args[0] rescue nil), (args[1] rescue nil)
114
+ username, password = agent.login(username, password)
114
115
 
115
- profile_name = (args[2] or ask 'Profile name (leave blank to select from available profiles):')
116
+ profile_name = (args[2] or (puts; ask 'Profile name (leave blank to select from available profiles):'))
116
117
  device_name = (args[3] or ask 'Device name:')
117
118
  udid = (args[4] or ask 'UDID:')
118
119
  team_name = args[5] rescue ''
119
120
 
121
+ if udid.match(/^[A-f0-9]{40}$/).nil?
122
+ say_error 'Invalid UDID entered, won\'t be inserted.'
123
+ end
124
+
120
125
  show_hint = false
121
126
 
122
127
  if !args[4]
@@ -124,8 +129,7 @@ command :add do |c|
124
129
  puts
125
130
  end
126
131
 
127
- agent = OneMoreUDID::PortalAgent.new
128
- agent.setup_cupertino(username, password, team_name)
132
+ agent.setup_cupertino(team_name)
129
133
 
130
134
  agent.add_device(device_name, udid)
131
135
 
@@ -136,7 +140,7 @@ command :add do |c|
136
140
  end
137
141
 
138
142
  if show_hint
139
- say_warning 'Note: you can repeat this process by running:'
143
+ say_warning 'Note: you can automate this process by running:'
140
144
 
141
145
  if agent.agent.instance_variable_get('@team')
142
146
  say_warning ' omudid add ' + Shellwords.escape(username) + ' [password] ' + Shellwords.escape(profile_name) + ' ' + Shellwords.escape(device_name) + ' ' + Shellwords.escape(udid) + ' ' + agent.agent.instance_variable_get('@team')
@@ -163,17 +167,17 @@ command :'testflight list-apps' do |c|
163
167
 
164
168
  c.action do |args, options|
165
169
 
166
- username = (args[0] or ask 'TestFlight Username:')
167
- password = (args[1] or pw 'TestFlight Password:')
170
+ agent = OneMoreUDID::TestFlightAgent.new
171
+
172
+ username, password = (args[0] rescue nil), (args[1] rescue nil)
173
+ username, password = agent.login(username, password)
168
174
 
169
175
  if !args[1]
170
- puts
171
- say_warning 'Note: you can repeat this process by running:'
176
+ say_warning 'Note: you can automate this process by running:'
172
177
  say_warning ' omudid testflight list-apps ' + Shellwords.escape(username) + ' [password]'
173
178
  puts
174
179
  end
175
180
 
176
- agent = OneMoreUDID::TestFlightAgent.new(username, password)
177
181
  apps = agent.get_apps()
178
182
 
179
183
  table = Terminal::Table.new do |t|
@@ -197,8 +201,10 @@ command :'testflight list-builds' do |c|
197
201
 
198
202
  c.action do |args, options|
199
203
 
200
- username = (args[0] or ask 'TestFlight Username:')
201
- password = (args[1] or pw 'TestFlight Password:')
204
+ agent = OneMoreUDID::TestFlightAgent.new
205
+ username, password = (args[0] rescue nil), (args[1] rescue nil)
206
+ username, password = agent.login(username, password)
207
+
202
208
  app_id = (args[2] or ask 'App ID (leave blank to select from available IDs):')
203
209
 
204
210
  show_hint = false
@@ -207,17 +213,16 @@ command :'testflight list-builds' do |c|
207
213
  show_hint = true
208
214
  end
209
215
 
210
- agent = OneMoreUDID::TestFlightAgent.new(username, password)
211
-
212
216
  if app_id == ''
217
+ apps = agent.get_apps().collect{ |id, name| id + ' ('+name+')' }
213
218
  puts
214
- choice = choose 'Select an app ID:', *agent.get_apps().collect{ |id, name| id + ' ('+name+')' }
219
+ choice = choose 'Select an app ID:', *apps
215
220
  puts
216
221
  regex = /^[^ ]*/
217
222
  app_id = (choice.match regex)[0]
218
223
  end
219
224
 
220
- say_warning 'Note: you can repeat this process by running:'
225
+ say_warning 'Note: you can automate this process by running:'
221
226
  say_warning ' omudid testflight list-builds ' + Shellwords.escape(username) + ' [password] ' + Shellwords.escape(app_id)
222
227
  puts
223
228
 
@@ -244,8 +249,10 @@ command :'testflight upload' do |c|
244
249
 
245
250
  c.action do |args, options|
246
251
 
247
- username = (args[0] or ask 'TestFlight Username:')
248
- password = (args[1] or pw 'TestFlight Password:')
252
+ agent = OneMoreUDID::TestFlightAgent.new
253
+ username, password = (args[0] rescue nil), (args[1] rescue nil)
254
+ username, password = agent.login(username, password)
255
+
249
256
  build_id = (args[2] or ask 'Build ID (leave blank to select from available IDs):')
250
257
  profile_name = (args[3] or ask 'Profile name (leave blank to select from available local profiles):')
251
258
 
@@ -255,21 +262,21 @@ command :'testflight upload' do |c|
255
262
  show_hint = true
256
263
  end
257
264
 
258
- agent = OneMoreUDID::TestFlightAgent.new(username, password)
259
-
260
265
  if build_id == ''
261
266
  app_id = ask 'Enter an App ID to list builds (or leave blank to list App IDs):'
262
267
 
263
268
  if app_id == ''
269
+ apps = agent.get_apps().collect{ |id, name| id + ' ('+name+')' }
264
270
  puts
265
- choice = choose 'Select an app ID:', *agent.get_apps().collect{ |id, name| id + ' ('+name+')' }
271
+ choice = choose 'Select an app ID:', *apps
266
272
  puts
267
273
  regex = /^[^ ]*/
268
274
  app_id = (choice.match regex)[0]
269
275
  end
270
276
 
277
+ builds = agent.get_builds(app_id).collect{ |id, name| id + ' ('+name+')' }
271
278
  puts
272
- choice = choose 'Select a build ID:', *agent.get_builds(app_id).collect{ |id, name| id + ' ('+name+')' }
279
+ choice = choose 'Select a build ID:', *builds
273
280
  puts
274
281
  regex = /^[^ ]*/
275
282
  build_id = (choice.match regex)[0]
@@ -286,7 +293,7 @@ command :'testflight upload' do |c|
286
293
  end
287
294
 
288
295
  if show_hint
289
- say_warning 'Note: you can repeat this process by running:'
296
+ say_warning 'Note: you can automate this process by running:'
290
297
  say_warning ' omudid testflight list-builds ' + Shellwords.escape(username) + ' [password] ' + Shellwords.escape(build_id) + ' ' + Shellwords.escape(profile_name)
291
298
  puts
292
299
  end
@@ -1,9 +1,54 @@
1
+ require 'keychain'
2
+
1
3
  module OneMoreUDID
2
4
  class PortalAgent
3
5
 
4
6
  attr_accessor :agent
7
+ attr_accessor :username, :password
8
+
9
+ def login(username, password)
10
+ if username != nil and password != nil
11
+ self.username, self.password = username, password
12
+ return
13
+ end
14
+
15
+ accounts = Keychain.generic_password_items.select { |item| item.label == "omudid" }
16
+ username = password = nil
17
+ if accounts and accounts.count > 0
18
+ choice = choose 'Select an account to use:', *accounts.collect{ |account| account.account }.push('New account').push('Delete account')
19
+ case choice
20
+ when "New account"
21
+ puts
22
+ when "Delete account"
23
+ puts
24
+ to_delete = choose 'Select an account to delete:', *accounts.collect{ |account| account.account }.push('ALL')
25
+ case to_delete
26
+ when "ALL"
27
+ accounts.each{ |account| account.delete }
28
+ else
29
+ account = Keychain.generic_password_items.find { |item| item.label == "omudid" and item.account == to_delete }.delete
30
+ end
31
+ abort
32
+ else
33
+ account = Keychain.generic_password_items.find { |item| item.label == "omudid" and item.account == choice }
34
+ username = account.account
35
+ password = account.password
36
+ end
37
+ end
38
+ if username == nil
39
+ username = ask 'Apple Username:'
40
+ password = pw 'Apple Password:'
41
+ puts
42
+ if agree 'Do you want to save these login details? (yes/no)'
43
+ Keychain.add_generic_password('omudid', username, password) rescue say_error 'Credentials not saved, email already stored in keychain.'
44
+ end
45
+ end
46
+
47
+ self.username, self.password = username, password
48
+ return username, password
49
+ end
5
50
 
6
- def get_teams(username, password)
51
+ def get_teams
7
52
  agent = Cupertino::ProvisioningPortal::Agent.new
8
53
 
9
54
  agent.instance_eval do
@@ -33,8 +78,8 @@ module OneMoreUDID
33
78
  end
34
79
  end
35
80
 
36
- agent.username = username
37
- agent.password = password
81
+ agent.username = self.username
82
+ agent.password = self.password
38
83
 
39
84
  agent.get('https://developer.apple.com/account/selectTeam.action')
40
85
 
@@ -50,7 +95,7 @@ module OneMoreUDID
50
95
  formatted_teams
51
96
  end
52
97
 
53
- def setup_cupertino(username, password, team_name = '')
98
+ def setup_cupertino(team_name = '')
54
99
  agent = Cupertino::ProvisioningPortal::Agent.new
55
100
 
56
101
  agent.instance_eval do
@@ -107,8 +152,8 @@ module OneMoreUDID
107
152
  end
108
153
  end
109
154
 
110
- agent.username = username
111
- agent.password = password
155
+ agent.username = self.username
156
+ agent.password = self.password
112
157
  agent.instance_variable_set(:@teamName, team_name)
113
158
 
114
159
  @agent = agent
@@ -1,13 +1,52 @@
1
+ require 'keychain'
2
+
1
3
  module OneMoreUDID
2
4
  class TestFlightAgent < ::Mechanize
3
5
 
4
6
  attr_accessor :username, :password
5
7
 
6
- def initialize(username, password)
7
- super()
8
- @username = username
9
- @password = password
10
- self
8
+ def login(username, password)
9
+ if username != nil and password != nil
10
+ self.username, self.password = username, password
11
+ return
12
+ end
13
+
14
+ accounts = Keychain.generic_password_items.select { |item| item.label == "testflight" }
15
+ username = password = nil
16
+ if accounts and accounts.count > 0
17
+ choice = choose 'Select an account to use:', *accounts.collect{ |account| account.account }.push('New account').push('Delete account')
18
+ case choice
19
+ when "New account"
20
+ puts
21
+ when "Delete account"
22
+ puts
23
+ to_delete = choose 'Select an account to delete:', *accounts.collect{ |account| account.account }.push('ALL')
24
+ case to_delete
25
+ when "ALL"
26
+ accounts.each{ |account| account.delete }
27
+ else
28
+ account = Keychain.generic_password_items.find { |item| item.label == "testflight" and item.account == to_delete }.delete
29
+ end
30
+ abort
31
+ else
32
+ account = Keychain.generic_password_items.find { |item| item.label == "testflight" and item.account == choice }
33
+ username = account.account
34
+ password = account.password
35
+ puts
36
+ end
37
+ end
38
+ if username == nil
39
+ username = ask 'Testflight Username:'
40
+ password = pw 'Testflight Password:'
41
+ puts
42
+ if agree 'Do you want to save these login details? (yes/no)'
43
+ Keychain.add_generic_password('testflight', username, password) rescue say_error 'Credentials not saved, email already stored in keychain.'
44
+ end
45
+ puts
46
+ end
47
+
48
+ self.username, self.password = username, password
49
+ return username, password
11
50
  end
12
51
 
13
52
  def get(uri, parameters = [], referer = nil, headers = {})
data/lib/omudid.rb CHANGED
@@ -3,7 +3,7 @@ require 'spinning_cursor'
3
3
  require 'rainbow'
4
4
 
5
5
  module OneMoreUDID
6
- VERSION = "1.0.6"
6
+
7
7
  end
8
8
 
9
9
  require 'omudid/local_agent'
data/omudid.gemspec CHANGED
@@ -2,11 +2,12 @@
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
- require 'omudid'
5
+ #require 'rubygems'
6
+ #require 'omudid'
6
7
 
7
8
  Gem::Specification.new do |spec|
8
9
  spec.name = "omudid"
9
- spec.version = OneMoreUDID::VERSION
10
+ spec.version = "1.0.7"
10
11
  spec.authors = ["David Lawson"]
11
12
  spec.email = ["tech.lawson@gmail.com"]
12
13
  spec.description = 'Conveniently add a UDID to the iOS Developer Portal, refresh a provisioning profile and download it. Uploading a new provisioning profile to TestFlight is also supported.'
@@ -21,8 +22,12 @@ Gem::Specification.new do |spec|
21
22
 
22
23
  spec.add_development_dependency "bundler", "~> 1.3"
23
24
  spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "vcr"
26
+ spec.add_development_dependency "webmock"
24
27
 
28
+ spec.add_dependency "nokogiri", "1.5.9"
25
29
  spec.add_dependency "cupertino"
30
+ spec.add_dependency "keychain_services"
26
31
 
27
32
  spec.add_dependency "spinning_cursor"
28
33
  spec.add_dependency "rainbow"
data/test/.DS_Store ADDED
Binary file
@@ -0,0 +1,37 @@
1
+ require 'rubygems'
2
+
3
+ require 'omudid'
4
+
5
+ module Commander
6
+ module UI
7
+ attr :password
8
+ end
9
+ end
10
+
11
+ require 'terminal-table'
12
+ require 'term/ansicolor'
13
+
14
+ require 'cupertino_compatibility'
15
+
16
+ require 'test/unit'
17
+ require 'vcr'
18
+ require 'omudid/portal_agent'
19
+
20
+ VCR.configure do |c|
21
+ c.cassette_library_dir = 'test/vcr'
22
+ c.hook_into :webmock # or :fakeweb
23
+ c.default_cassette_options = { :serialize_with => :syck }
24
+ end
25
+
26
+ class OneMoreUDIDTest < Test::Unit::TestCase
27
+ def test_teams
28
+ VCR.use_cassette('teams') do
29
+ agent = OneMoreUDID::PortalAgent.new
30
+ teams = agent.get_teams('test@email.com', 'password')
31
+
32
+ assert teams.count == 2
33
+ assert teams['XYZ1'] == 'Team 1'
34
+ assert teams['XYZ2'] == 'Team 2 - iOS Developer Program'
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,682 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://developer.apple.com/account/selectTeam.action
6
+ body:
7
+ string: ""
8
+ headers:
9
+ Accept:
10
+ - "*/*"
11
+ Accept-Language:
12
+ - en-us,en;q=0.5
13
+ User-Agent:
14
+ - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22
15
+ Accept-Charset:
16
+ - ISO-8859-1,utf-8;q=0.7,*;q=0.7
17
+ Host:
18
+ - developer.apple.com
19
+ Accept-Encoding:
20
+ - gzip,deflate,identity
21
+ Keep-Alive:
22
+ - 300
23
+ Connection:
24
+ - keep-alive
25
+ response:
26
+ status:
27
+ code: 302
28
+ message: Moved Temporarily
29
+ headers:
30
+ Location:
31
+ - https://daw.apple.com/cgi-bin/WebObjects/DSAuthWeb.woa/wa/login?appIdKey=d4f7d769c2abecc664d0dadfed6a67f943442b5e9c87524d4587a95773750cea&path=%2F%2Faccount%2FselectTeam.action
32
+ Set-Cookie:
33
+ - NSC_MCWT_efwfmpqfs_443_BqbdifKbwb=ffffffff12f61da945525d5f4f58455e445a4a4232aa;Version=1;path=/;secure;httponly
34
+ Cache-Control:
35
+ - post-check=0, pre-check=0
36
+ Server:
37
+ - Apache
38
+ Content-Type:
39
+ - text/plain
40
+ Last-Modified:
41
+ - Thu, 27 Jun 2013 07:35:22 GMT
42
+ Content-Length:
43
+ - "0"
44
+ Ms-Author-Via:
45
+ - DAV
46
+ Expires:
47
+ - Mon, 26 Jul 1997 05:00:00 GMT
48
+ Pragma:
49
+ - no-cache
50
+ X-Frame-Options:
51
+ - SAMEORIGIN
52
+ - SAMEORIGIN
53
+ Keep-Alive:
54
+ - timeout=15, max=479
55
+ Date:
56
+ - Thu, 27 Jun 2013 07:35:22 GMT
57
+ Connection:
58
+ - Keep-Alive
59
+ body:
60
+ string: ""
61
+ http_version:
62
+ recorded_at: Thu, 27 Jun 2013 07:35:33 GMT
63
+ - request:
64
+ method: get
65
+ uri: https://daw.apple.com/cgi-bin/WebObjects/DSAuthWeb.woa/wa/login?appIdKey=d4f7d769c2abecc664d0dadfed6a67f943442b5e9c87524d4587a95773750cea&path=//account/selectTeam.action
66
+ body:
67
+ string: ""
68
+ headers:
69
+ Accept:
70
+ - "*/*"
71
+ Accept-Language:
72
+ - en-us,en;q=0.5
73
+ User-Agent:
74
+ - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22
75
+ Accept-Charset:
76
+ - ISO-8859-1,utf-8;q=0.7,*;q=0.7
77
+ Host:
78
+ - daw.apple.com
79
+ Accept-Encoding:
80
+ - gzip,deflate,identity
81
+ Keep-Alive:
82
+ - 300
83
+ Connection:
84
+ - keep-alive
85
+ response:
86
+ status:
87
+ code: 200
88
+ message: Apple
89
+ headers:
90
+ Cache-Control:
91
+ - max-age=0
92
+ - must-revalidate
93
+ - no-cache
94
+ - no-store
95
+ - private
96
+ Server:
97
+ - Apache
98
+ Content-Type:
99
+ - text/html; charset=iso-8859-1
100
+ Content-Length:
101
+ - "8171"
102
+ Expires:
103
+ - Wed, 05-Jun-2013 18:38:39 GMT
104
+ Pragma:
105
+ - no-cache
106
+ Cneonction:
107
+ - close
108
+ Date:
109
+ - Thu, 27 Jun 2013 07:35:23 GMT
110
+ body:
111
+ string: "<!DOCTYPE html>\n\
112
+ <html lang=\"en-us\">\n\
113
+ <head>\n\
114
+ \t<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n\
115
+ \t<meta name=\"Author\" content=\"Apple Inc.\" />\n\
116
+ \t<meta name=\"viewport\" content=\"width=1024\" />\n\
117
+ \t<link rel=\"shortcut icon\" href=\"https://devimages.apple.com.edgekey.net/favicon.ico\" />\n\
118
+ \t<link rel=\"icon\" href=\"https://devimages.apple.com.edgekey.net/favicon.ico\" />\n\
119
+ \t<link rel=\"stylesheet\" href=\"https://devimages.apple.com.edgekey.net/assets/core/styles/base.css\" type=\"text/css\" />\n\
120
+ \t<link rel=\"stylesheet\" href=\"https://devimages.apple.com.edgekey.net/assets/core/styles/adc.css\" type=\"text/css\" />\n\
121
+ \t<script src=\"https://devimages.apple.com.edgekey.net/assets/core/scripts/lib/prototype.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\
122
+ \t<script src=\"https://devimages.apple.com.edgekey.net/assets/core/scripts/lib/scriptaculous.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\
123
+ \t<script src=\"https://devimages.apple.com.edgekey.net/assets/core/scripts/browserdetect.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\
124
+ \t<script src=\"https://devimages.apple.com.edgekey.net/assets/core/scripts/apple_core.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\
125
+ \t<script src=\"https://devimages.apple.com.edgekey.net/assets/core/scripts/search_decorator.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\
126
+ \t<script src=\"https://devimages.apple.com.edgekey.net/assets/core/scripts/adc_core.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\
127
+ \t<script src=\"https://devimages.apple.com.edgekey.net/assets/scripts/ac_retina.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\
128
+ \t<script type=\"text/javascript\">\n\
129
+ \t\tdocument.write('<link rel=\"stylesheet\" type=\"text/css\" href=\"https://devimages.apple.com.edgekey.net/assets/styles/script.css\" media=\"screen\">');\n\
130
+ \t</script>\t\n\
131
+ \t\n\
132
+ \t<title>Sign in with your Apple ID - Apple Developer</title>\n\
133
+ \t<link rel=\"stylesheet\" href=\"https://devimages.apple.com.edgekey.net/assets/styles/linen.css\" type=\"text/css\" />\n\
134
+ \t<link rel=\"stylesheet\" href=\"https://devimages.apple.com.edgekey.net/login/styles/linen.css\" type=\"text/css\" />\n\
135
+ \t<script>\n\
136
+ \tEvent.onDOMReady(function() {\n\
137
+ \t\t// password expired page\n\
138
+ \t\tif ($$('span.dsheading').length > 0) {\n\
139
+ \t\t\t$$('#ds_container .dslabel label').each(function(el) { el.innerHTML += ':'; });\n\
140
+ \t\t\tif ($$('span.dserror').length > 0) {\n\
141
+ \t\t\t\t$$('span.dserror').each(function(el) {\n\
142
+ \t\t\t\t\tel.innerHTML = el.innerHTML.gsub('AppleID', 'Apple ID');\n\
143
+ \t\t\t\t});\n\
144
+ \t\t\t\t$$('img').each(function(img) {\n\
145
+ \t\t\t\t\timg.hide();\n\
146
+ \t\t\t\t});\n\
147
+ \t\t\t}\n\
148
+ \t\t\t$('content').show();\n\
149
+ \t\t\tif($$('span.dsheading')[0].innerHTML == \"Sign In Successful\") {\n\
150
+ \t\t\t\t// update secret info page\n\
151
+ \t\t\t\t$$('body.login')[0].addClassName('update-info');\n\
152
+ \t\t\t\t$$('input').each(function(el) {\n\
153
+ \t\t\t\t\tel.observe('keyup', function(e) {\n\
154
+ \t\t\t\t\t\tif(e.keyCode == Event.KEY_RETURN) {\n\
155
+ \t\t\t\t\t\t\tdocument.harvestForm.submit();\n\
156
+ \t\t\t\t\t\t\te.stop();\n\
157
+ \t\t\t\t\t\t}\n\
158
+ \t\t\t\t\t});\n\
159
+ \t\t\t\t});\n\
160
+ \t\t\t} else {\n\
161
+ \t\t\t\t// regular password expired pages\n\
162
+ \t\t\t\t$$('body.login')[0].addClassName('password-expired');\n\
163
+ \t\t\t\t$$('input').each(function(el) {\n\
164
+ \t\t\t\t\tel.observe('keyup', function(e) {\n\
165
+ \t\t\t\t\t\tif(e.keyCode == Event.KEY_RETURN) {\n\
166
+ \t\t\t\t\t\t\tdocument.appleConnectExpiredPasswordForm.submit();\n\
167
+ \t\t\t\t\t\t\te.stop();\n\
168
+ \t\t\t\t\t\t}\n\
169
+ \t\t\t\t\t});\n\
170
+ \t\t\t\t});\n\
171
+ \t\t\t}\n\
172
+ \t\t}\n\
173
+ \t\t// wrong password page\n\
174
+ \t\telse if ($$('span.dserror').length > 0) {\n\
175
+ \t\t\t$$('body.login')[0].addClassName('password-wrong');\n\
176
+ \t\t\t$$('#ds_container .dslabel').each(function(el) { el.innerHTML += ':'; });\n\
177
+ \t\t\t$('content').show();\n\
178
+ \t\t\tdocument.appleConnectForm.theAccountPW.focus();\n\
179
+ \t\t}\n\
180
+ \t\t// basic login page\n\
181
+ \t\telse {\n\
182
+ \t\t\t$$('#ds_container .dslabel').each(function(el) { el.innerHTML += ':'; });\n\
183
+ \t\t\t$$('#ds_container tr')[1].hide();\n\
184
+ \t\t\t$('content').show();\n\
185
+ \t\t}\n\
186
+ \t});\n\
187
+ \t</script>\n\
188
+ </head>\n\
189
+ <body class=\"login\" onload=\"dsfocus()\">\n\
190
+ \t<div class=\"content-wrapper\">\n\n\
191
+ \t\t<div id=\"globalheader\" data-hires=\"true\">\n\
192
+ \t\t\t<h1><a href=\"https://developer.apple.com/\">Apple Developer</a></h1>\n\
193
+ \t\t</div>\n\n\
194
+ \t\t<div id=\"content\" class=\"content\" style=\"display:none;\">\n\n\
195
+ \t\t\t<header class=\"hero\">\n\
196
+ \t\t\t\t<hgroup>\n\
197
+ \t\t\t\t\t<h1>Sign in with your Apple ID</h1>\n\
198
+ \t\t\t\t\t<p class=\"intro\">Use the Apple ID you used to register or register now.</p>\n\
199
+ \t\t\t\t</hgroup>\n\
200
+ \t\t\t</header>\n\n\
201
+ \t\t\t\t\n\
202
+ \t\n\
203
+ \t\n\
204
+ \t\t\n\
205
+ \t\t\t<script>\n\
206
+ \tfunction dsfocus(){ document.appleConnectForm.theAccountName.focus(); }\n\
207
+ </script>\n\n\n\
208
+ \t\n\
209
+ \t\t<div id=\"ds_container\">\n\
210
+ \t\n\
211
+ \t\n\n\n\n\n\
212
+ \t\n\
213
+ \t\t\n\
214
+ \t\t\t<form method=\"post\" name=\"appleConnectForm\" action=\"/cgi-bin/WebObjects/DSAuthWeb.woa/733/wo/IQAxF6JbTkvtCLOxMCDmig/0.1.3.1.1.2.1.1.3.1.1\">\n\n\
215
+ \t\t\t\t\n\
216
+ \t\t\t\t\n\
217
+ \t\t\t\t\n\
218
+ \t\t\t\t\n\
219
+ \t\t\t\t\n\
220
+ \t\t\t\t\n\
221
+ \t\t\t\t\n\
222
+ \t\t\t\t\n\
223
+ \t\t\t\t\n\
224
+ \t\t\t\t\n\
225
+ \t\t\t\t\n\
226
+ \t\t\t\t\t<table cellpadding=0 cellspacing=0 border=0 width=273>\n\
227
+ \t\t\t\t\t\t<tr valign=top>\n\
228
+ \t\t\t\t\t\t\t<td align=left><font size=2><font face=\"Geneva, Verdana, Arial, Helvetica, sans-serif\" size=1 class=\"G10\" />\n\
229
+ \t\t\t\t\t\t\t\t<label for=\"accountname\"><span class=\"dslabel\">Apple ID</span></label>\n\
230
+ \t\t\t\t\t\t\t\t<font color=\"#ff1102\"></font></font /><br>\n\
231
+ \t\t\t\t\t\t\t\t<font size='2'><input size=\"30\" autocapitalize=\"off\" autocorrect=\"off\" maxlength=\"128\" id=\"accountname\" type=\"text\" name=\"theAccountName\" /></font></font>\n\
232
+ \t\t\t\t\t\t\t\t\n\
233
+ \t\t\t\t\t\t\t</td>\n\
234
+ \t\t\t\t\t\t</tr>\n\
235
+ \t\t\t\t\t\t\n\
236
+ \t\t\t\t\t\t<tr><td><img alt=\"\" width=\"273\" height=\"5\" src=\"/AppleConnect/US-EN/spacer.gif\" /></td></tr>\n\
237
+ \t\t\t\t\t\t<tr><td><img alt=\"\" width=\"273\" height=\"5\" src=\"/AppleConnect/US-EN/spacer.gif\" /></td></tr>\n\
238
+ \t\t\t\t\t\t<tr>\n\
239
+ \t\t\t\t\t\t\t<td align='left'>\n\
240
+ \t\t\t\t\t\t\t\t<font face=\"Geneva, Verdana, Arial, Helvetica, sans-serif\" size=1 class=\"G10\" />\n\
241
+ \t\t\t\t\t\t\t\t\t<label for=\"accountpassword\"><span class=\"dslabel\">Password</span></label>\n\
242
+ \t\t\t\t\t\t\t\t</font />\n\
243
+ \t\t\t\t\t\t\t\t<br>\n\
244
+ \t\t\t\t\t\t\t\t<input size=\"30\" autocapitalize=\"off\" oncut=\"return false ;\" oncopy=\"return false ;\" autocorrect=\"off\" maxlength=\"32\" id=\"accountpassword\" type=\"password\" name=\"theAccountPW\" /><input border=\"0\" width=\"0\" height=\"0\" type=\"image\" name=\"1.Continue\" src=\"/AppleConnect/US-EN/spacer.gif\" />\n\
245
+ \t\t\t\t\t\t\t</td>\n\
246
+ \t\t\t\t\t\t</tr>\n\
247
+ \t\t\t\t\t\t\n\
248
+ \t\t\t\t\t\t\n\
249
+ \t\t\t\t\t\t\n\
250
+ \t\t\t\t\t\t<tr><td><img alt=\"\" width=\"273\" height=\"5\" src=\"/AppleConnect/US-EN/spacer.gif\" /></td></tr>\n\
251
+ \t\t\t\t\t\t<tr><td><img alt=\"\" width=\"273\" height=\"5\" src=\"/AppleConnect/US-EN/spacer.gif\" /></td></tr>\n\
252
+ \t\t\t\t\t\t\n\
253
+ \t\t\t\t\t\t<tr>\n\
254
+ \t\t\t\t\t\t\t<td>\n\
255
+ \t\t\t\t\t\t\t\t<table cellspacing='0' border='0' width='273' cellpadding='0'>\n\
256
+ \t\t\t\t\t\t\t\t\t<tr align='left'>\n\
257
+ \t\t\t\t\t\t\t\t\t\t\n\
258
+ \t\t\t\t\t\t\t\t\t\t\t<td align='left' width='170'>\n\
259
+ \t\t\t\t\t\t\t\t\t\t\t\t\n\n\
260
+ \t\t\t\t\t\t\t\t\t\t\t\t\n\
261
+ \t\t\t\t\t\t\t\t\t\t\t\t\t<font size='1'>\n\
262
+ \t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"dstext\">\n\
263
+ \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\
264
+ \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\
265
+ \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\
266
+ \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\
267
+ \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- Show Forgot Password Button as button -->\n\
268
+ \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input border=\"0\" alt=\"Did you forget your password?\" type=\"image\" name=\"1.Forgot\" src=\"/AppleConnect/US-EN/adc09_forgot_password.png\" />\n\
269
+ \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\
270
+ \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\
271
+ \t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\
272
+ \t\t\t\t\t\t\t\t\t\t\t\t\t</font>\n\
273
+ \t\t\t\t\t\t\t\t\t\t\t\t\n\
274
+ \t\t\t\t\t\t\t\t\t\t\t</td>\n\
275
+ \t\t\t\t\t\t\t\t\t\t\t<td width='15'><img alt=\"\" width=\"15\" height=\"5\" src=\"/AppleConnect/US-EN/spacer.gif\" /></td>\n\
276
+ \t\t\t\t\t\t\t\t\t\t\n\
277
+ \t\t\t\t\t\t\t\t\t\t\n\
278
+ \t\t\t\t\t\t\t\t\t\t\n\
279
+ \t\t\t\t\t\t\t\t\t\t\t<td align='left' width='88'><input border=\"0\" alt=\"Sign In\" type=\"image\" name=\"1.Continue\" src=\"/AppleConnect/US-EN/adc09_signin.png\" /></td>\n\
280
+ \t\t\t\t\t\t\t\t\t\t\n\
281
+ \t\t\t\t\t\t\t\t\t\t\n\
282
+ \t\t\t\t\t\t\t\t\t</tr>\n\
283
+ \t\t\t\t\t\t\t\t</table>\n\
284
+ \t\t\t\t\t\t\t</td>\n\
285
+ \t\t\t\t\t\t</tr>\n\
286
+ \t\t\t\t\t</table>\n\
287
+ \t\t\t\t\t<input type=\"hidden\" name=\"theAuxValue\" />\n\
288
+ \t\t\t\t\n\
289
+ \t\t\t<input type=\"hidden\" name=\"wosid\" value=\"IQAxF6JbTkvtCLOxMCDmig\" /></form>\n\
290
+ \t\t\n\n\
291
+ \t\t\n\
292
+ \t\t\n\
293
+ \t\t\n\
294
+ \t\t\n\
295
+ \t\t\t\n\
296
+ </div>\n\n\
297
+ \t\n\
298
+ \t\n\
299
+ \t\n\
300
+ \t\n\
301
+ \t\n\n\n\n\n\
302
+ \t\t\n\
303
+ \t\t\n\
304
+ \t\n\
305
+ \t\t\t\n\n\
306
+ \t\t\t<a class=\"button large blue password-update\" onclick=\"document.appleConnectExpiredPasswordForm.submit(); return false;\"><span>Update</span></a>\n\
307
+ \t\t\t<a class=\"button large register-button\" href=\"https://developer.apple.com/programs/register/\"><span>Register</span></a>\n\
308
+ \t\t\t<a class=\"button large blue signin-button\" onclick=\"document.appleConnectForm.submit(); return false;\"><span>Sign In</span></a>\n\
309
+ \t\t\t<div class=\"divider\"></div>\n\
310
+ \t\t\t<a class=\"forgot-button\" href=\"https://iforgot.apple.com/\">Forgot ID or Password?</a>\n\
311
+ \t\t\t\t\t\n\
312
+ \t\t</div><!-- /content -->\n\n\
313
+ \t\t<div class=\"content-spacer\"></div>\n\n\
314
+ \t\t<div id=\"globalfooter\">\n\
315
+ \t\t\t<div class=\"gf-sosumi\">\n\
316
+ \t\t\t\t<p>Copyright \xA9 2013 Apple Inc. All rights reserved.</p>\n\
317
+ \t\t\t\t<ul class=\"piped\">\n\
318
+ \t\t\t\t\t<li><a href=\"http://www.apple.com/legal/terms/site.html\" class=\"first\">Terms of Use</a></li>\n\
319
+ \t\t\t\t\t<li><a href=\"http://www.apple.com/privacy/\">Privacy Policy</a></li>\n\
320
+ \t\t\t\t</ul>\n\
321
+ \t\t\t</div>\n\
322
+ \t\t</div><!--/globalfooter-->\n\
323
+ \t</div>\n\
324
+ </body>\n\
325
+ </html>"
326
+ http_version:
327
+ recorded_at: Thu, 27 Jun 2013 07:35:34 GMT
328
+ - request:
329
+ method: post
330
+ uri: https://daw.apple.com/cgi-bin/WebObjects/DSAuthWeb.woa/733/wo/IQAxF6JbTkvtCLOxMCDmig/0.1.3.1.1.2.1.1.3.1.1
331
+ body:
332
+ string: theAccountName=test@email.com&theAccountPW=password&theAuxValue=&wosid=IQAxF6JbTkvtCLOxMCDmig
333
+ headers:
334
+ Referer:
335
+ - !ruby/object:URI::HTTPS
336
+ fragment:
337
+ host: daw.apple.com
338
+ opaque:
339
+ password:
340
+ path: /cgi-bin/WebObjects/DSAuthWeb.woa/wa/login
341
+ port: 443
342
+ query: appIdKey=d4f7d769c2abecc664d0dadfed6a67f943442b5e9c87524d4587a95773750cea&path=%2F%2Faccount%2FselectTeam.action
343
+ registry:
344
+ scheme: https
345
+ user:
346
+ Accept:
347
+ - "*/*"
348
+ Accept-Language:
349
+ - en-us,en;q=0.5
350
+ User-Agent:
351
+ - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22
352
+ Accept-Charset:
353
+ - ISO-8859-1,utf-8;q=0.7,*;q=0.7
354
+ Content-Type:
355
+ - application/x-www-form-urlencoded
356
+ Host:
357
+ - daw.apple.com
358
+ Content-Length:
359
+ - "108"
360
+ Accept-Encoding:
361
+ - gzip,deflate,identity
362
+ Keep-Alive:
363
+ - 300
364
+ Connection:
365
+ - keep-alive
366
+ response:
367
+ status:
368
+ code: 200
369
+ message: Apple
370
+ headers:
371
+ Set-Cookie:
372
+ - DefaultAppleID=thisCookieIsToBeRemovedAtTheNextResponse; version="1"; max-age=0; expires=Thu, 01-Jan-1970 00:00:00 GMT; path=/; domain=.apple.com
373
+ - ds01=thisCookieIsToBeRemovedAtTheNextResponse; version="1"; max-age=0; expires=Thu, 01-Jan-1970 00:00:00 GMT; path=/; domain=.apple.com
374
+ - ds01_a=056e619bd5b2b91867ba64ff14360013fb6cfdfbf22ba93d292a81c1ac3fcc492e2cfdbf14081b75fca5d3b933f25c84c2c72c775613bae8f6ea0cf10f2fcca1c6026560e1701760d7c4a9200b9d41dfc1ceadab02fb3635412c59648311b586GZVX; version="1"; expires=Fri, 27-Jun-2014 07:35:24 GMT; path=/; domain=.apple.com
375
+ - ds01_p_c_1001=thisCookieIsToBeRemovedAtTheNextResponse; version="1"; max-age=0; expires=Thu, 01-Jan-1970 00:00:00 GMT; path=/; domain=.apple.com
376
+ - myacinfo=DAWTKNV2b35735344c00759cd70102a9f415865b4413adc3d254a65dafc4359bb95ae591e940a6963e1ae23545999f9330411956eafa6f3f949ebd2a709baccf283376f2f1d514b67b8324c98641225c57bd69f7f673308cc5b19020c95ea42a4722bc0d9dc3c6fd53ed5d2542fe3c5803ba24ed6967343f50ff38148c0a12bbbaf19056e0d0a74e143536ddbeaafd3b19bdd36ca801f0c41e40050b6663bb28846e2bf2d6b41636d23cc6ab264925de3f8a4e798c29645b9b799e2fd7cb262f922b599da048d2d4162913d6361a996a650bc1ba3b90ff635bd57238c7bfcd14db5c8e7eacf37794298c9a224dc92734d0dbbdfed5690233abe3761bfc7c24e103bc2d534e5d90ce21d2fbd4785497765d7dd1ce2f8b55d32289689ebb9ade0ce10a135bMVRYV2; version="1"; path=/; domain=.apple.com; secure; HttpOnly
377
+ - myacinfoName=BA710667A884C9ECD61188E9CE70F5F1C5BE108F044A95112F92FC238E8837D8; version="1"; expires=Fri, 31-Dec-2010 20:00:00 GMT; path=/; domain=.apple.com
378
+ Cache-Control:
379
+ - max-age=0
380
+ - must-revalidate
381
+ - no-cache
382
+ - no-store
383
+ - private
384
+ Server:
385
+ - Apache
386
+ Content-Type:
387
+ - text/html; charset=iso-8859-1
388
+ Content-Length:
389
+ - "289"
390
+ Expires:
391
+ - Wed, 05-Jun-2013 18:38:39 GMT
392
+ Pragma:
393
+ - no-cache
394
+ Date:
395
+ - Thu, 27 Jun 2013 07:35:24 GMT
396
+ Nncoection:
397
+ - close
398
+ body:
399
+ string: |
400
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
401
+ <HTML>
402
+ <HEAD>
403
+ <META NAME="generator" CONTENT="WebObjects 5">
404
+ <TITLE>Apple</TITLE>
405
+ <META HTTP-EQUIV="REFRESH" CONTENT="0;URL=https://developer.apple.com/account/selectTeam.action" />
406
+ </HEAD>
407
+ <BODY BGCOLOR=#FFFFFF>
408
+ </BODY>
409
+ </HTML>
410
+
411
+ http_version:
412
+ recorded_at: Thu, 27 Jun 2013 07:35:36 GMT
413
+ - request:
414
+ method: get
415
+ uri: https://developer.apple.com/account/selectTeam.action
416
+ body:
417
+ string: ""
418
+ headers:
419
+ Accept:
420
+ - "*/*"
421
+ Accept-Language:
422
+ - en-us,en;q=0.5
423
+ User-Agent:
424
+ - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22
425
+ If-Modified-Since:
426
+ - Thu, 27 Jun 2013 07:35:22 GMT
427
+ Cookie:
428
+ - NSC_MCWT_efwfmpqfs_443_BqbdifKbwb=ffffffff12f61da945525d5f4f58455e445a4a4232aa; ds01_a=056e619bd5b2b91867ba64ff14360013fb6cfdfbf22ba93d292a81c1ac3fcc492e2cfdbf14081b75fca5d3b933f25c84c2c72c775613bae8f6ea0cf10f2fcca1c6026560e1701760d7c4a9200b9d41dfc1ceadab02fb3635412c59648311b586GZVX; myacinfo=DAWTKNV2b35735344c00759cd70102a9f415865b4413adc3d254a65dafc4359bb95ae591e940a6963e1ae23545999f9330411956eafa6f3f949ebd2a709baccf283376f2f1d514b67b8324c98641225c57bd69f7f673308cc5b19020c95ea42a4722bc0d9dc3c6fd53ed5d2542fe3c5803ba24ed6967343f50ff38148c0a12bbbaf19056e0d0a74e143536ddbeaafd3b19bdd36ca801f0c41e40050b6663bb28846e2bf2d6b41636d23cc6ab264925de3f8a4e798c29645b9b799e2fd7cb262f922b599da048d2d4162913d6361a996a650bc1ba3b90ff635bd57238c7bfcd14db5c8e7eacf37794298c9a224dc92734d0dbbdfed5690233abe3761bfc7c24e103bc2d534e5d90ce21d2fbd4785497765d7dd1ce2f8b55d32289689ebb9ade0ce10a135bMVRYV2
429
+ Accept-Charset:
430
+ - ISO-8859-1,utf-8;q=0.7,*;q=0.7
431
+ Host:
432
+ - developer.apple.com
433
+ Accept-Encoding:
434
+ - gzip,deflate,identity
435
+ Keep-Alive:
436
+ - 300
437
+ Connection:
438
+ - keep-alive
439
+ response:
440
+ status:
441
+ code: 200
442
+ message: OK
443
+ headers:
444
+ Transfer-Encoding:
445
+ - chunked
446
+ Set-Cookie:
447
+ - JSESSIONID=FED2AF4286021A3A61DE953F12BCC84A.worker1; Path=/
448
+ Cache-Control:
449
+ - no-cache
450
+ Server:
451
+ - Apache
452
+ Content-Type:
453
+ - text/html;charset=ISO-8859-1
454
+ Ms-Author-Via:
455
+ - DAV
456
+ Expires:
457
+ - Mon, 26 Jul 1997 05:00:00 GMT
458
+ Pragma:
459
+ - no-cache
460
+ X-Frame-Options:
461
+ - SAMEORIGIN
462
+ - SAMEORIGIN
463
+ Keep-Alive:
464
+ - timeout=15, max=421
465
+ Date:
466
+ - Thu, 27 Jun 2013 07:35:25 GMT
467
+ Connection:
468
+ - Keep-Alive
469
+ body:
470
+ string: |-
471
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
472
+
473
+
474
+ <html>
475
+ <head>
476
+ <title>Select Team - Apple Developer</title>
477
+
478
+
479
+
480
+
481
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
482
+ <meta http-equiv="pics-label" content='(pics-1.1 "http://www.icra.org/ratingsv02.html" l gen true for "http://www.apple.com" r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://www.apple.com" r (n 0 s 0 v 0 l 0))'>
483
+ <meta name="Author" content="Apple Inc.">
484
+ <meta name="viewport" content="width=1024">
485
+ <link rel="shortcut icon" href="https://devimages.apple.com.edgekey.net/favicon.ico" />
486
+ <link rel="icon" href="https://devimages.apple.com.edgekey.net/favicon.ico" />
487
+
488
+ <link rel="stylesheet" type="text/css" media="screen" href="https://devimages.apple.com.edgekey.net/assets/core/styles/base.css" charset="utf-8" />
489
+ <link rel="stylesheet" type="text/css" media="screen" href="https://devimages.apple.com.edgekey.net/assets/core/styles/adc.css" charset="utf-8" />
490
+
491
+ <link rel="stylesheet" type="text/css" media="screen" href="https://devimages.apple.com.edgekey.net/assets/styles/jqueryui/smoothness-custom-1.8.17/jquery-ui-1.8.17.css" charset="utf-8" />
492
+ <link rel="stylesheet" type="text/css" media="screen" href="https://devimages.apple.com.edgekey.net/assets/scripts/lib/jqgrid/css/ui.jqgrid.css" charset="utf-8" />
493
+ <link rel="stylesheet" type="text/css" media="screen" href="https://devimages.apple.com.edgekey.net/assets/styles/grid.css" charset="utf-8" />
494
+
495
+ <link rel="stylesheet" type="text/css" media="screen" href="https://devimages.apple.com.edgekey.net/assets/styles/portal.css" charset="utf-8" />
496
+ <link rel="stylesheet" type="text/css" media="screen" href="https://developer.apple.com/account/styles/developer_portal.css" charset="utf-8" />
497
+
498
+ <script type="text/javascript" src="https://developer.apple.com/assets/scripts/lib/jquery/jquery-1.7.1.min.js" charset="utf-8" ></script>
499
+ <script type="text/javascript" src="https://developer.apple.com/assets/scripts/lib/jquery/jquery-ui-custom-1.8.17.min.js" charset="utf-8" ></script>
500
+ <script type="text/javascript" src="https://developer.apple.com/assets/scripts/lib/jqgrid/js/i18n/grid.locale-en.js" charset="utf-8" ></script>
501
+ <script type="text/javascript" src="https://developer.apple.com/assets/scripts/lib/jqgrid/js/jquery.jqGrid.src.js" charset="utf-8" ></script>
502
+ <script type="text/javascript" src="https://developer.apple.com/assets/scripts/search_decorator_jquery.js" charset="utf-8" ></script>
503
+ <script type="text/javascript" src="https://developer.apple.com/assets/scripts/ac_retina.js" charset="utf-8" ></script>
504
+
505
+ <script type="text/javascript" src="https://developer.apple.com/account/scripts/account-min.js" charset="utf-8" ></script>
506
+
507
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
508
+
509
+
510
+ </head>
511
+ <body id="select-team" class="developer-portal class="selectProgram"" >
512
+
513
+
514
+
515
+
516
+
517
+
518
+ <div id="globalheader" data-hires="true">
519
+ <h1><a href="https://developer.apple.com">Apple Developer</a></h1>
520
+ <ul id="gh-nav">
521
+ <li id="gh-nav-technologies"><a href="https://developer.apple.com/technologies/">Technologies</a></li>
522
+ <li id="gh-nav-resources"><a href="https://developer.apple.com/resources/">Resources</a></li>
523
+ <li id="gh-nav-programs"><a href="https://developer.apple.com/programs/">Programs</a></li>
524
+ <li id="gh-nav-support"><a href="https://developer.apple.com/support/">Support</a></li>
525
+ <li id="gh-nav-membercenter"><a href="https://developer.apple.com/membercenter/">Member Center</a></li>
526
+ </ul>
527
+
528
+ <div id="gh-search">
529
+ <form action="https://developer.apple.com/search/index.php" method="get" accept-charset="utf-8">
530
+ <div>
531
+ <label for="gh-adcsearch">
532
+ <span class="prettyplaceholder">Search Developer</span>
533
+ <input type="search" name="q" id="gh-adcsearch" class="adcsearch prettysearch" results="0" placeholder="Search Developer" autosave="">
534
+ </label>
535
+ </div>
536
+ </form>
537
+ </div>
538
+ </div>
539
+
540
+ <div class="loadingMessage" data-hires="true" style=" width:32px; height:32px; display: none;">
541
+ <img src="https://devimages.apple.com.edgekey.net/assets/developerportal/images/spinner.gif" /><div>Loading...</div>
542
+ </div>
543
+
544
+ <div class="errorGenericMessage" style="display: none;">
545
+ Please refresh and try again.
546
+ </div>
547
+
548
+ <div id="main">
549
+ <div id="content" class="content" data-hires="true">
550
+ <div class="topbar">
551
+ <h1>Certificates, Identifiers & Profiles</h1>
552
+ <div class="topbar-select-container">
553
+ <a class="topbar-select portal-select" id="topbar-select">
554
+ <span class="section-title">
555
+
556
+ David&nbsp;Lawson
557
+
558
+
559
+ </span>
560
+ </a>
561
+
562
+ <div class="tooltip top-pointer" id="topbar-dropdown-tooltip" style="display:none">
563
+ <div class="top edge"></div>
564
+ <div class="tooltip-content">
565
+ <div class="content-wrapper">
566
+ <ul class="topbar-dropdown-options">
567
+
568
+ <li class="profile"><a href="https://developer.apple.com/membercenter/index.action#accountSummary" class="first-option">View Account</a></li>
569
+
570
+ <li class="sign-out"><a href="/account/logout.action;jsessionid=FED2AF4286021A3A61DE953F12BCC84A.worker1" class="last-option">Sign Out</a></li>
571
+
572
+
573
+ </ul>
574
+ </div>
575
+ </div>
576
+ </div>
577
+ </div>
578
+ </div>
579
+
580
+
581
+
582
+
583
+
584
+
585
+
586
+
587
+
588
+
589
+
590
+
591
+ <div class="sidebar" style="display:none;" data-hideSideNav="true">
592
+ <div class="top-shadow"></div>
593
+
594
+ <a class="sidebar-select portal-select" id="sidebar-select"><div class="section-icon mac"></div><div class="section-title"></div><div class="dropdown-arrow"></div></a>
595
+ <div class="select-dropdown rounded" style="display: none;">
596
+ <ul class="dropdown-options">
597
+ <li class="overview-option"><a href="/account/overview.action;jsessionid=FED2AF4286021A3A61DE953F12BCC84A.worker1" class="first-option"><span>Overview</span><div class="checkmark"></div></a></li>
598
+
599
+
600
+
601
+ </ul>
602
+ </div>
603
+
604
+ <div class="horizontal-divider"></div>
605
+
606
+
607
+
608
+
609
+
610
+
611
+ </div>
612
+
613
+ <div class="innercontent">
614
+
615
+ <div class="teams">
616
+ <h2>Select Team</h2>
617
+
618
+ <div class="team-selection">
619
+ <form id="saveTeamSelection" name="saveTeamSelection" action="/account/saveTeamSelection.action;jsessionid=FED2AF4286021A3A61DE953F12BCC84A.worker1" method="post">
620
+ <div class="input">
621
+ <p class="lead">You're a member of multiple development teams. Select a team to continue.</p>
622
+
623
+ <p class="team-value">
624
+ <input type="radio" class="radio" name="memberDisplayId" id="teams1" value="XYZ1">
625
+ <label for="teams1" class="label-primary">
626
+ Team 1
627
+ </label>
628
+ <label for="teams1" class="label-secondary"></label>
629
+
630
+ </p>
631
+
632
+ <p class="team-value">
633
+ <input type="radio" class="radio" name="memberDisplayId" id="teams2" value="XYZ2">
634
+ <label for="teams2" class="label-primary">
635
+ Team 2
636
+ </label>
637
+ <label for="teams2" class="label-secondary">iOS Developer Program</label>
638
+
639
+ </p>
640
+
641
+ </div>
642
+ <div class="sidebarDivider">
643
+ <div class="buttoncontainer">
644
+ <a href="/account/overview.action;jsessionid=FED2AF4286021A3A61DE953F12BCC84A.worker1" class="button large"><span>Cancel</span></a>
645
+ <input type="submit" id="saveTeamSelection_saveTeamSelection_save" name="action:saveTeamSelection!save" value="Continue" class="button large blue submit"/>
646
+
647
+ </div>
648
+ </div>
649
+ </form>
650
+
651
+
652
+
653
+
654
+ </div>
655
+
656
+
657
+ </div>
658
+
659
+ </div>
660
+
661
+
662
+
663
+
664
+
665
+
666
+ </div><!-- /content -->
667
+ </div><!-- /main -->
668
+
669
+ <div id="globalfooter">
670
+ <div class="gf-sosumi">
671
+ <p>Copyright &copy; 2013 Apple Inc. All rights reserved.</p>
672
+ <ul class="piped">
673
+ <li><a href="http://www.apple.com/legal/terms/site.html" class="first">Terms of Use</a></li>
674
+ <li><a href="http://www.apple.com/privacy/">Privacy Policy</a></li>
675
+ </ul>
676
+ </div>
677
+ </div>
678
+ </body>
679
+ </html>
680
+ http_version:
681
+ recorded_at: Thu, 27 Jun 2013 07:35:37 GMT
682
+ recorded_with: VCR 2.5.0
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 0
8
- - 6
9
- version: 1.0.6
8
+ - 7
9
+ version: 1.0.7
10
10
  platform: ruby
11
11
  authors:
12
12
  - David Lawson
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2013-06-27 00:00:00 +10:00
17
+ date: 2013-07-02 00:00:00 +10:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -43,7 +43,7 @@ dependencies:
43
43
  type: :development
44
44
  version_requirements: *id002
45
45
  - !ruby/object:Gem::Dependency
46
- name: cupertino
46
+ name: vcr
47
47
  prerelease: false
48
48
  requirement: &id003 !ruby/object:Gem::Requirement
49
49
  requirements:
@@ -52,10 +52,10 @@ dependencies:
52
52
  segments:
53
53
  - 0
54
54
  version: "0"
55
- type: :runtime
55
+ type: :development
56
56
  version_requirements: *id003
57
57
  - !ruby/object:Gem::Dependency
58
- name: spinning_cursor
58
+ name: webmock
59
59
  prerelease: false
60
60
  requirement: &id004 !ruby/object:Gem::Requirement
61
61
  requirements:
@@ -64,12 +64,26 @@ dependencies:
64
64
  segments:
65
65
  - 0
66
66
  version: "0"
67
- type: :runtime
67
+ type: :development
68
68
  version_requirements: *id004
69
69
  - !ruby/object:Gem::Dependency
70
- name: rainbow
70
+ name: nokogiri
71
71
  prerelease: false
72
72
  requirement: &id005 !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "="
75
+ - !ruby/object:Gem::Version
76
+ segments:
77
+ - 1
78
+ - 5
79
+ - 9
80
+ version: 1.5.9
81
+ type: :runtime
82
+ version_requirements: *id005
83
+ - !ruby/object:Gem::Dependency
84
+ name: cupertino
85
+ prerelease: false
86
+ requirement: &id006 !ruby/object:Gem::Requirement
73
87
  requirements:
74
88
  - - ">="
75
89
  - !ruby/object:Gem::Version
@@ -77,11 +91,47 @@ dependencies:
77
91
  - 0
78
92
  version: "0"
79
93
  type: :runtime
80
- version_requirements: *id005
94
+ version_requirements: *id006
95
+ - !ruby/object:Gem::Dependency
96
+ name: keychain_services
97
+ prerelease: false
98
+ requirement: &id007 !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ segments:
103
+ - 0
104
+ version: "0"
105
+ type: :runtime
106
+ version_requirements: *id007
107
+ - !ruby/object:Gem::Dependency
108
+ name: spinning_cursor
109
+ prerelease: false
110
+ requirement: &id008 !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ type: :runtime
118
+ version_requirements: *id008
119
+ - !ruby/object:Gem::Dependency
120
+ name: rainbow
121
+ prerelease: false
122
+ requirement: &id009 !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ segments:
127
+ - 0
128
+ version: "0"
129
+ type: :runtime
130
+ version_requirements: *id009
81
131
  - !ruby/object:Gem::Dependency
82
132
  name: commander
83
133
  prerelease: false
84
- requirement: &id006 !ruby/object:Gem::Requirement
134
+ requirement: &id010 !ruby/object:Gem::Requirement
85
135
  requirements:
86
136
  - - ~>
87
137
  - !ruby/object:Gem::Version
@@ -91,7 +141,7 @@ dependencies:
91
141
  - 2
92
142
  version: 4.1.2
93
143
  type: :runtime
94
- version_requirements: *id006
144
+ version_requirements: *id010
95
145
  description: Conveniently add a UDID to the iOS Developer Portal, refresh a provisioning profile and download it. Uploading a new provisioning profile to TestFlight is also supported.
96
146
  email:
97
147
  - tech.lawson@gmail.com
@@ -103,6 +153,7 @@ extra_rdoc_files: []
103
153
 
104
154
  files:
105
155
  - .gitignore
156
+ - .travis.yml
106
157
  - Gemfile
107
158
  - LICENSE.txt
108
159
  - README.md
@@ -114,6 +165,9 @@ files:
114
165
  - lib/omudid/portal_agent.rb
115
166
  - lib/omudid/testflight_agent.rb
116
167
  - omudid.gemspec
168
+ - test/.DS_Store
169
+ - test/test_omudid.rb
170
+ - test/vcr/teams.yml
117
171
  has_rdoc: true
118
172
  homepage: https://github.com/Papercloud/OneMoreUDID
119
173
  licenses:
@@ -144,5 +198,7 @@ rubygems_version: 1.3.6
144
198
  signing_key:
145
199
  specification_version: 3
146
200
  summary: Add one UDID to iOS Dev Portal & TestFlight
147
- test_files: []
148
-
201
+ test_files:
202
+ - test/.DS_Store
203
+ - test/test_omudid.rb
204
+ - test/vcr/teams.yml