headdesk 0.15.1 → 0.16.0

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
  SHA256:
3
- metadata.gz: 9d6af332045568797f79f7cc2c7699439ca7b0cc5f42fe13605ea0ac95129638
4
- data.tar.gz: 7e7877116e24fed277018590c3e21bd4a595b554b5a25cd4b09c584cfd8df3bf
3
+ metadata.gz: 43122fb0ed6467db6c61fd068aefcf8a66134cd07a281f5dd82cc11b416ec96d
4
+ data.tar.gz: ee42b2fd9dc5b4ff5e37435709d97ce2b2cd3a0075471377e6be85dde5d48b7f
5
5
  SHA512:
6
- metadata.gz: 1d974bcff24bc9a68dba5d21a2a92e525c3994b7bc883845caff969851f39aecadd1bc0a8056d8bb3b6901e4223cb1f57c72f6c07017069303d7acced4ecf2be
7
- data.tar.gz: 3135d661e46740d57fec4af8a4694b01368bb47da619fcc2d46a5c75373048b3e97852c7f6b8dd1a5d781e2ebf3a74bc4667cc50261a72b0e41c732dd45463c3
6
+ metadata.gz: b2db44040e759c6d6866adab9012405b790d935f3ccab7b45bbbe722d389f041c8740756a030501f5a6b4b607a05afd8e23cffe2e840d1820388314d228f0b30
7
+ data.tar.gz: ff9a2c645296db69e4b5ca9b0aa1e3361c6e517d0d3e154e6cd83998135ef22b759ae7dc7724923c9b34f534768c8125bb8738fce3ab2645af90ce8d5d40bdd3
data/Gemfile.lock CHANGED
@@ -1,11 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- headdesk (0.15.0)
4
+ headdesk (0.15.1)
5
5
  awesome_print (~> 1.8)
6
6
  gems (~> 1.1)
7
7
  nokogiri (~> 1.10)
8
8
  oily_png (~> 1.2)
9
+ plist (~> 3.5)
9
10
  thor (~> 0.20)
10
11
 
11
12
  GEM
@@ -34,13 +35,14 @@ GEM
34
35
  json (2.1.0)
35
36
  kwalify (0.7.2)
36
37
  mini_portile2 (2.4.0)
37
- nokogiri (1.10.7)
38
+ nokogiri (1.10.8)
38
39
  mini_portile2 (~> 2.4.0)
39
40
  oily_png (1.2.1)
40
41
  chunky_png (~> 1.3.7)
41
42
  parallel (1.13.0)
42
43
  parser (2.5.3.0)
43
44
  ast (~> 2.4.0)
45
+ plist (3.5.0)
44
46
  powerpack (0.1.2)
45
47
  psych (3.1.0)
46
48
  rainbow (3.0.0)
@@ -101,4 +103,4 @@ DEPENDENCIES
101
103
  simplecov (~> 0, >= 0.16.0)
102
104
 
103
105
  BUNDLED WITH
104
- 2.0.1
106
+ 2.1.4
data/headdesk.gemspec CHANGED
@@ -38,5 +38,6 @@ Gem::Specification.new do |spec|
38
38
  spec.add_dependency 'gems', '~> 1.1'
39
39
  spec.add_dependency 'nokogiri', '~> 1.10'
40
40
  spec.add_dependency 'oily_png', '~> 1.2'
41
+ spec.add_dependency 'plist', '~> 3.5'
41
42
  spec.add_dependency 'thor', '~> 0.20'
42
43
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'headdesk/apk'
4
+ require 'headdesk/ipa'
4
5
 
5
6
  module Headdesk
6
7
  #
@@ -8,7 +9,14 @@ module Headdesk
8
9
  #
9
10
  class Analyze
10
11
  def self.at(path)
11
- Headdesk::Apk.new(path).analyze
12
+ begin
13
+ return Headdesk::Apk.new(path).analyze
14
+ rescue
15
+ end
16
+ begin
17
+ return Headdesk::Ipa.new(path).analyze
18
+ end
19
+ throw CliError.new('Path did not contain an unpacked IPA or APK.')
12
20
  end
13
21
  end
14
22
  end
@@ -11,11 +11,11 @@ module Headdesk
11
11
  attr_reader :report, :status, :apk, :ipa
12
12
 
13
13
  def self.for_apk
14
- APK.all
14
+ APK.all || []
15
15
  end
16
16
 
17
17
  def self.for_ipa
18
- IPA.all
18
+ IPA.all || []
19
19
  end
20
20
 
21
21
  def self.included(klass)
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'plist'
4
+
5
+ require 'headdesk/apk/class'
6
+ require 'headdesk/apk/resources'
7
+ require 'headdesk/check'
8
+ require 'headdesk/report'
9
+
10
+ module Headdesk
11
+ #
12
+ # Representation of an unzipped IPA file
13
+ #
14
+ class Ipa
15
+ attr_reader :info_plist, :url_schemes, :entitlements
16
+
17
+ Entitlements = Struct.new(:application_identifier, :aps_environment, :associated_domains, :team_identifier, :get_task_allow)
18
+
19
+ def initialize(path)
20
+ @path = path
21
+
22
+ apktool_yml = File.join(@path, 'apktool.yml').freeze
23
+ was_unpacked_by_apktool = File.exist?(apktool_yml)
24
+
25
+ @path = File.join(@path, 'unknown') if was_unpacked_by_apktool
26
+ @path = Dir[File.join(@path, 'Payload','*.app')].first
27
+
28
+ info_plist_path = File.join(@path, 'Info.plist').freeze
29
+
30
+ throw CliError.new('Path did not contain Info.plist') unless File.exist?(info_plist_path)
31
+
32
+ @info_plist = Plist.parse_xml(info_plist_path)
33
+
34
+ @url_schemes = []
35
+ @info_plist['CFBundleURLTypes'].each do |url_type|
36
+ url_type['CFBundleURLSchemes'].each do |url_scheme|
37
+ @url_schemes << url_scheme
38
+ end
39
+ end
40
+
41
+ entitlements = Plist.parse_xml(`codesign -d --entitlements :- #{@path}`)
42
+ @entitlements = Entitlements.new(
43
+ entitlements['application-identifier'],
44
+ entitlements['aps-environment'],
45
+ entitlements['com.apple.developer.associated-domains'],
46
+ entitlements['com.apple.developer.team-identifier'],
47
+ entitlements['get-task-allow']
48
+ )
49
+ end
50
+
51
+ def analyze
52
+ report = Headdesk::IPAReport.new(self)
53
+
54
+ Headdesk::Check.for_ipa.each do |check_type|
55
+ check = check_type.new(self)
56
+ report << check.process
57
+ end
58
+
59
+ # TODO: Associated domains
60
+ report
61
+ end
62
+ end
63
+ end
@@ -92,4 +92,33 @@ module Headdesk
92
92
  )
93
93
  end
94
94
  end
95
+
96
+ #
97
+ # Report from an IPA analysis
98
+ #
99
+ class IPAReport < Report
100
+ def initialize(ipa)
101
+ super()
102
+ @bundle_id = ipa.info_plist['CFBundleIdentifier']
103
+ @url_schemes = ipa.url_schemes
104
+ @entitlements = ipa.entitlements
105
+ end
106
+
107
+ def describe
108
+ <<~DESCRIPTION
109
+ URL Schemes: #{@url_schemes}
110
+ Team Id: #{@entitlements.team_identifier}
111
+ Associated Domains: #{@entitlements.associated_domains}
112
+ DESCRIPTION
113
+ end
114
+
115
+ def to_h
116
+ super.merge(
117
+ ipa: true,
118
+ url_schemes: @url_schemes,
119
+ team_id: @entitlements.team_identifier,
120
+ associated_domains: @entitlements.associated_domains
121
+ )
122
+ end
123
+ end
95
124
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Headdesk
4
- VERSION = '0.15.1'
4
+ VERSION = '0.16.0'
5
5
  APKTOOL_VERSION = '2.3.4'
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: headdesk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.1
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pat Wilson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-07 00:00:00.000000000 Z
11
+ date: 2020-02-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -176,6 +176,20 @@ dependencies:
176
176
  - - "~>"
177
177
  - !ruby/object:Gem::Version
178
178
  version: '1.2'
179
+ - !ruby/object:Gem::Dependency
180
+ name: plist
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - "~>"
184
+ - !ruby/object:Gem::Version
185
+ version: '3.5'
186
+ type: :runtime
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '3.5'
179
193
  - !ruby/object:Gem::Dependency
180
194
  name: thor
181
195
  requirement: !ruby/object:Gem::Requirement
@@ -247,6 +261,7 @@ files:
247
261
  - lib/headdesk/data/facebook_sdk_versions.yaml
248
262
  - lib/headdesk/descriptionator.rb
249
263
  - lib/headdesk/descriptionator/resources.rb
264
+ - lib/headdesk/ipa.rb
250
265
  - lib/headdesk/report.rb
251
266
  - lib/headdesk/version.rb
252
267
  - lib/headdesk/versions.rb