device_api-ios 1.0.3 → 1.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 44a319cbde8d0c83a2c6ce73f50a9f659381363e
4
- data.tar.gz: 5a5251780401174266d85ce74f4c547f8736633b
3
+ metadata.gz: f131af055b0b58b5ef4378fed43b28e7b67d028a
4
+ data.tar.gz: 353f90a18052442c2213db25ee7007defb8a27af
5
5
  SHA512:
6
- metadata.gz: 62bd6649f4d4beceb65bbbae499a0daec718543557380eaefb6d6717c62369af546d50806961c720ee30ed8f22d20c8587777773ca842c2c3afe5f2e8110158b
7
- data.tar.gz: 0654d20a10cc4b7d461c3d31253f50fa2ea090d9d3af46be195e62ef6cf9c2a7fbc0f7b4e1b1b637e2fab4985f0feb2276b165a502f0855f8c1cc5566bdc5a70
6
+ metadata.gz: 437802096cbf0dec1d15c350d3d74189d6bb299f0a3fb3bd4bd208ebc5e11742949bcae4b24a722d96b744903f74ac57fd177105e02bc149e9d66e0e97dfa728
7
+ data.tar.gz: 4477c6442a539b7a8bda12e1657c931e763d481aa98e8e9d45c081dfa5cf412ba5c520bd893d991e4270aa74a4df5c571b2a164eddd967cddede98bdb4056064
data/Gemfile CHANGED
@@ -6,5 +6,4 @@ gem 'ox'
6
6
 
7
7
  group :test do
8
8
  gem 'rspec'
9
- gem 'pry'
10
9
  end
@@ -1,16 +1,9 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- coderay (1.1.0)
5
4
  device_api (1.0.1)
6
5
  diff-lcs (1.2.5)
7
6
  ios-devices (0.2.1)
8
- method_source (0.8.2)
9
- ox (2.2.1)
10
- pry (0.10.2)
11
- coderay (~> 1.1.0)
12
- method_source (~> 0.8.1)
13
- slop (~> 3.4)
14
7
  rspec (3.3.0)
15
8
  rspec-core (~> 3.3.0)
16
9
  rspec-expectations (~> 3.3.0)
@@ -24,7 +17,6 @@ GEM
24
17
  diff-lcs (>= 1.2.0, < 2.0)
25
18
  rspec-support (~> 3.3.0)
26
19
  rspec-support (3.3.0)
27
- slop (3.6.0)
28
20
 
29
21
  PLATFORMS
30
22
  ruby
@@ -32,6 +24,7 @@ PLATFORMS
32
24
  DEPENDENCIES
33
25
  device_api (>= 1.0.0)
34
26
  ios-devices
35
- ox
36
- pry
37
27
  rspec
28
+
29
+ BUNDLED WITH
30
+ 1.10.5
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'device_api-ios'
3
- s.version = '1.0.3'
3
+ s.version = '1.0.4'
4
4
  s.date = Time.now.strftime("%Y-%m-%d")
5
5
  s.summary = 'IOS Device Management API'
6
6
  s.description = 'iOS implementation of DeviceAPI'
@@ -31,17 +31,23 @@ module DeviceAPI
31
31
  raise PlistutilCommandError.new('plistutil not found') unless plistutil_available?
32
32
  result = execute("plistutil -i #{plist}")
33
33
  raise PlistutilCommandError.new(result.stderr) if result.exit != 0
34
- info = Ox.parse(result.stdout)
34
+ parse_xml(result.stdout)
35
+ end
36
+
37
+ def self.parse_xml(xml)
38
+ info = Ox.parse(xml)
35
39
  nodes = info.locate('*/dict')
36
40
  values = {}
37
41
  last_key = nil
38
- nodes.each do |node|
39
- node.nodes.each do |child|
40
- if child.value == 'key'
41
- last_key = child.nodes.first
42
- elsif child.value == 'string'
43
- values[last_key] = child.nodes.first
42
+ nodes.first.nodes.each do |child|
43
+ if child.value == 'key'
44
+ if child.nodes.first == 'get-task-allow'
45
+ values['get-task-allow'] = nodes.first.nodes[nodes.first.nodes.index(child)+1].value
46
+ next
44
47
  end
48
+ last_key = child.nodes.first
49
+ elsif child.value == 'string'
50
+ values[last_key] = child.nodes.first
45
51
  end
46
52
  end
47
53
  values
@@ -1,4 +1,5 @@
1
1
  require 'device_api/execution'
2
+ require 'device_api/ios/plistutil'
2
3
 
3
4
  # DeviceAPI - an interface to allow for automation of devices
4
5
  module DeviceAPI
@@ -42,11 +43,33 @@ module DeviceAPI
42
43
  cert = options[:cert]
43
44
  entitlements = options[:entitlements]
44
45
  app = options[:app]
46
+ original_app = nil
45
47
 
46
- result = execute("codesign --force --sign #{cert} --entitlements #{entitlements} '#{app}'")
48
+ if is_ipa?(app)
49
+ original_app = app
50
+ app = unpack_ipa(app)
51
+ end
52
+
53
+ # Check to see if the entitlements passed in is a file or the XML
54
+ unless File.exists?(entitlements)
55
+ file = Tempfile.new('entitlements')
56
+ file.write(entitlements)
57
+ file.close
58
+ entitlements = file.path
59
+ end
60
+
61
+ result = execute("codesign --force --sign '#{cert}' --entitlements #{entitlements} '#{app}'")
47
62
 
48
63
  raise SigningCommandError.new(result.stderr) if result.exit != 0
49
64
 
65
+ zip_app(app, original_app) if original_app
66
+ end
67
+
68
+ def self.zip_app(payload_path, ipa_path)
69
+ result = execute("cd #{File.dirname(payload_path)}; zip -r #{ipa_path} ../Payload ")
70
+ raise SigningCommandError.new(result.stderr) if result.exit != 0
71
+
72
+ true
50
73
  end
51
74
 
52
75
  def self.get_signing_certs
@@ -63,16 +86,29 @@ module DeviceAPI
63
86
  certs
64
87
  end
65
88
 
66
- def self.get_entitlements(app_path)
89
+ def self.get_entitlements(app_path, raw = false)
67
90
  app_path = unpack_ipa(app_path) if is_ipa?(app_path)
68
91
  result = execute("codesign -d --entitlements - #{app_path}")
69
92
 
70
- require 'pry'
71
- binding.pry
72
93
  if result.exit != 0
73
94
  raise SigningCommandError.new(result.stderr)
74
95
  end
75
- return result.stdout
96
+
97
+ # Clean up the result as it occasionally contains invalid UTF-8 characters
98
+ xml = result.stdout.to_s.encode('UTF-8', 'UTF-8', invalid: :replace)
99
+ xml = xml[xml.index('<')..xml.length]
100
+
101
+ return xml if raw
102
+ entitlements = Plistutil.parse_xml(xml)
103
+ return entitlements
104
+ end
105
+
106
+ def self.enable_get_tasks(app_path)
107
+ entitlements = get_entitlements(app_path, raw: true)
108
+
109
+ return entitlements if entitlements.scan(/<key>get-task-allow<\/key>\\n.*<true\/>/).count > 0
110
+
111
+ entitlements.gsub('<false/>', '<true/>') if entitlements.scan(/<key>get-task-allow<\/key>\\n.*<false\/>/)
76
112
  end
77
113
  end
78
114
 
@@ -43,20 +43,61 @@ describe DeviceAPI::IOS::Signing do
43
43
  end
44
44
 
45
45
  describe "entitlements" do
46
+ plist = <<-eos
47
+ <?xml version="1.0" encoding="UTF-8"?>
48
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
49
+ <plist version="1.0">
50
+ <dict>
51
+ <key>application-identifier</key>
52
+ <string>uk.co.bbc.test</string>
53
+ <key>com.apple.developer.team-identifier</key>
54
+ <string>ABC1DE2345</string>
55
+ <key>get-task-allow</key>
56
+ <false/>
57
+ <key>keychain-access-groups</key>
58
+ <array>
59
+ <string>uk.co.bbc.iplayer.test</string>
60
+ </array>
61
+ </dict>
62
+ </plist>
63
+ eos
64
+
46
65
  it 'returns a list of entitlements for an app' do
47
- out = <<-eos
48
- <dict>
49
- <key>application-identifier</key>
50
- <string>uk.co.bbc.test</string>
51
- <key>get-task-allow</key>
52
- <false/>
53
- </dict>
54
- eos
55
66
  allow(Open3).to receive(:capture3) {
56
- [out, '', (Struct.new(:exitstatus)).new(0)]
67
+ [plist, '', (Struct.new(:exitstatus)).new(0)]
68
+ }
69
+
70
+ expected_result = {
71
+ 'application-identifier' => 'uk.co.bbc.test',
72
+ 'com.apple.developer.team-identifier' => 'ABC1DE2345',
73
+ 'get-task-allow' => 'false'
57
74
  }
75
+ expect(DeviceAPI::IOS::Signing.get_entitlements('')).to eq(expected_result)
76
+ end
58
77
 
59
- expect(DeviceAPI::IOS::Signing.get_entitlements('test.ipa')).to eq(true)
78
+ it 'should replace the entitlements for an app' do
79
+ expected = <<-eos
80
+ <?xml version="1.0" encoding="UTF-8"?>
81
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
82
+ <plist version="1.0">
83
+ <dict>
84
+ <key>application-identifier</key>
85
+ <string>uk.co.bbc.test</string>
86
+ <key>com.apple.developer.team-identifier</key>
87
+ <string>ABC1DE2345</string>
88
+ <key>get-task-allow</key>
89
+ <true/>
90
+ <key>keychain-access-groups</key>
91
+ <array>
92
+ <string>uk.co.bbc.iplayer.test</string>
93
+ </array>
94
+ </dict>
95
+ </plist>
96
+ eos
97
+ allow(Open3).to receive(:capture3) {
98
+ [plist, '', (Struct.new(:exitstatus)).new(0)]
99
+ }
100
+ expect(DeviceAPI::IOS::Signing.enable_get_tasks('test.ipa')).to eq(expected)
60
101
  end
61
102
  end
62
103
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: device_api-ios
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - BBC
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-02-03 00:00:00.000000000 Z
13
+ date: 2016-02-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: device_api