app-info 2.8.5 → 3.0.0.beta2

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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +12 -7
  3. data/.github/workflows/ci.yml +3 -1
  4. data/.rubocop.yml +33 -11
  5. data/CHANGELOG.md +34 -1
  6. data/Gemfile +7 -1
  7. data/README.md +68 -13
  8. data/Rakefile +11 -0
  9. data/app_info.gemspec +12 -3
  10. data/lib/app_info/aab.rb +48 -108
  11. data/lib/app_info/android/signature.rb +114 -0
  12. data/lib/app_info/android/signatures/base.rb +53 -0
  13. data/lib/app_info/android/signatures/info.rb +158 -0
  14. data/lib/app_info/android/signatures/v1.rb +63 -0
  15. data/lib/app_info/android/signatures/v2.rb +121 -0
  16. data/lib/app_info/android/signatures/v3.rb +131 -0
  17. data/lib/app_info/android/signatures/v4.rb +18 -0
  18. data/lib/app_info/android.rb +162 -0
  19. data/lib/app_info/apk.rb +54 -111
  20. data/lib/app_info/apple.rb +192 -0
  21. data/lib/app_info/certificate.rb +175 -0
  22. data/lib/app_info/const.rb +75 -0
  23. data/lib/app_info/core_ext/object/try.rb +3 -1
  24. data/lib/app_info/core_ext/string/inflector.rb +2 -0
  25. data/lib/app_info/dsym/debug_info.rb +72 -0
  26. data/lib/app_info/dsym/macho.rb +55 -0
  27. data/lib/app_info/dsym.rb +31 -135
  28. data/lib/app_info/error.rb +2 -2
  29. data/lib/app_info/file.rb +49 -0
  30. data/lib/app_info/helper/archive.rb +37 -0
  31. data/lib/app_info/helper/file_size.rb +25 -0
  32. data/lib/app_info/helper/generate_class.rb +29 -0
  33. data/lib/app_info/helper/protobuf.rb +12 -0
  34. data/lib/app_info/helper/signatures.rb +229 -0
  35. data/lib/app_info/helper.rb +5 -126
  36. data/lib/app_info/info_plist.rb +66 -29
  37. data/lib/app_info/ipa/framework.rb +4 -4
  38. data/lib/app_info/ipa.rb +61 -135
  39. data/lib/app_info/macos.rb +54 -102
  40. data/lib/app_info/mobile_provision.rb +67 -49
  41. data/lib/app_info/pe.rb +260 -0
  42. data/lib/app_info/png_uncrush.rb +24 -4
  43. data/lib/app_info/proguard.rb +29 -16
  44. data/lib/app_info/protobuf/manifest.rb +6 -3
  45. data/lib/app_info/protobuf/models/Configuration_pb.rb +1 -0
  46. data/lib/app_info/protobuf/models/README.md +7 -0
  47. data/lib/app_info/protobuf/models/Resources_pb.rb +2 -0
  48. data/lib/app_info/protobuf/resources.rb +5 -5
  49. data/lib/app_info/version.rb +1 -1
  50. data/lib/app_info.rb +90 -46
  51. metadata +48 -35
@@ -6,8 +6,9 @@ require 'app_info/core_ext'
6
6
 
7
7
  module AppInfo
8
8
  module Protobuf
9
+ # AAB Protobuf Base class
9
10
  class Base
10
- include Helper::Defines
11
+ include Helper::GenerateClass
11
12
 
12
13
  def initialize(doc, resources = nil)
13
14
  @resources = resources
@@ -21,6 +22,7 @@ module AppInfo
21
22
  end
22
23
  end
23
24
 
25
+ # AAB Protobuf Attribute
24
26
  class Attribute < Base
25
27
  attr_reader :namespace, :name, :value, :resource_id
26
28
 
@@ -47,6 +49,8 @@ module AppInfo
47
49
  end
48
50
  end
49
51
 
52
+ # AAB Protobuf Node class.
53
+ # example: manifest,activity, activity-alias, service, receiver, provider, application
50
54
  class Node < Base
51
55
  attr_reader :name, :attributes, :children
52
56
 
@@ -106,6 +110,7 @@ module AppInfo
106
110
  end
107
111
  end
108
112
 
113
+ # AAB Protobuf Manifest
109
114
  class Manifest < Node
110
115
  def self.parse(io, resources = nil)
111
116
  doc = Aapt::Pb::XmlNode.decode(io)
@@ -170,7 +175,6 @@ module AppInfo
170
175
  end.flatten.uniq
171
176
  end
172
177
 
173
- # :nodoc:
174
178
  # Workaround ruby always return true by called `Object.const_defined?(Data)`
175
179
  class Data < Node; end
176
180
 
@@ -222,7 +226,6 @@ module AppInfo
222
226
 
223
227
  type ||= name.split('.')[2]
224
228
  raise ProtobufParseError, 'Not found intent type' unless TYPES.include?(type)
225
-
226
229
  return false unless intent = send(type.to_sym)
227
230
 
228
231
  values = intent.select { |e| e.name == name }
@@ -118,6 +118,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
118
118
  end
119
119
  end
120
120
 
121
+ # @!visibility private
121
122
  module Aapt
122
123
  module Pb
123
124
  Configuration = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.Configuration").msgclass
@@ -9,6 +9,13 @@ protoc --ruby_out=. Resources.proto
9
9
  protoc --ruby_out=. Configuration.proto
10
10
  ```
11
11
 
12
+ ## Decode
13
+
14
+ ```bash
15
+ protoc --decode=aapt.pb.ResourceTable Resources.proto < aab/base/BundleConfig.pb > BundleConfig.txt
16
+ protoc --decode=aapt.pb.ResourceTable Resources.proto < aab/base/native.pb > native.txt
17
+ ```
18
+
12
19
  ## Resouces
13
20
 
14
21
  `Configuration.proto` and `Resources.proto` can be found in aapt2's github:
@@ -322,7 +322,9 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
322
322
  end
323
323
  end
324
324
 
325
+ # @!visibility private
325
326
  module Aapt
327
+
326
328
  module Pb
327
329
  StringPool = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.StringPool").msgclass
328
330
  SourcePosition = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.SourcePosition").msgclass
@@ -12,7 +12,7 @@ module AppInfo
12
12
  new(doc)
13
13
  end
14
14
 
15
- include Helper::ReferenceParser
15
+ include Helper::Protobuf
16
16
 
17
17
  attr_reader :packages, :tool_fingerprint
18
18
 
@@ -53,7 +53,7 @@ module AppInfo
53
53
  end
54
54
 
55
55
  class Package
56
- include Helper::Defines
56
+ include Helper::GenerateClass
57
57
 
58
58
  attr_reader :name, :types
59
59
 
@@ -113,14 +113,14 @@ module AppInfo
113
113
  end
114
114
 
115
115
  class Entry
116
+ include Helper::GenerateClass
117
+
116
118
  def self.parse_from(type, package)
117
119
  type.entry.each_with_object([]) do |entry, obj|
118
120
  obj << Entry.new(entry, package)
119
121
  end
120
122
  end
121
123
 
122
- include Helper::Defines
123
-
124
124
  attr_reader :name, :values
125
125
 
126
126
  def initialize(doc, package)
@@ -155,7 +155,7 @@ module AppInfo
155
155
  end
156
156
 
157
157
  class Value
158
- include Helper::ReferenceParser
158
+ include Helper::Protobuf
159
159
  extend Forwardable
160
160
 
161
161
  attr_reader :locale, :config, :original_value, :value, :type
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AppInfo
4
- VERSION = '2.8.5'
4
+ VERSION = '3.0.0.beta2'
5
5
  end
data/lib/app_info.rb CHANGED
@@ -1,24 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'app_info/version'
4
- require 'app_info/error'
5
4
  require 'app_info/core_ext'
5
+ require 'app_info/const'
6
+ require 'app_info/certificate'
6
7
  require 'app_info/helper'
8
+ require 'app_info/error'
7
9
 
10
+ require 'app_info/file'
8
11
  require 'app_info/info_plist'
9
12
  require 'app_info/mobile_provision'
10
13
 
14
+ require 'app_info/apple'
15
+ require 'app_info/macos'
11
16
  require 'app_info/ipa'
12
17
  require 'app_info/ipa/plugin'
13
18
  require 'app_info/ipa/framework'
14
19
 
20
+ require 'app_info/android'
15
21
  require 'app_info/apk'
16
22
  require 'app_info/aab'
17
23
 
18
24
  require 'app_info/proguard'
19
25
  require 'app_info/dsym'
20
26
 
21
- require 'app_info/macos'
27
+ require 'app_info/pe'
22
28
 
23
29
  # fix invaild date format warnings
24
30
  Zip.warn_invalid_date = false
@@ -26,44 +32,58 @@ Zip.warn_invalid_date = false
26
32
  # AppInfo Module
27
33
  module AppInfo
28
34
  class << self
29
- UNKNOWN_FORMAT = :unkown
30
-
31
35
  # Get a new parser for automatic
32
36
  def parse(file)
33
- raise NotFoundError, file unless File.exist?(file)
34
-
35
- case file_type(file)
36
- when :ipa then IPA.new(file)
37
- when :apk then APK.new(file)
38
- when :aab then AAB.new(file)
39
- when :mobileprovision then MobileProvision.new(file)
40
- when :dsym then DSYM.new(file)
41
- when :proguard then Proguard.new(file)
42
- when :macos then Macos.new(file)
43
- else
44
- raise UnkownFileTypeError, "Do not detect file type: #{file}"
45
- end
37
+ raise NotFoundError, file unless ::File.exist?(file)
38
+
39
+ parser = case file_type(file)
40
+ when Format::IPA then IPA.new(file)
41
+ when Format::APK then APK.new(file)
42
+ when Format::AAB then AAB.new(file)
43
+ when Format::MOBILEPROVISION then MobileProvision.new(file)
44
+ when Format::DSYM then DSYM.new(file)
45
+ when Format::PROGUARD then Proguard.new(file)
46
+ when Format::MACOS then Macos.new(file)
47
+ when Format::PE then PE.new(file)
48
+ else
49
+ raise UnknownFormatError, "Do not detect file format: #{file}"
50
+ end
51
+
52
+ return parser unless block_given?
53
+
54
+ # call block and clear!
55
+ yield parser
56
+ parser.clear!
46
57
  end
47
58
  alias dump parse
48
59
 
49
60
  def parse?(file)
50
- file_type(file) != UNKNOWN_FORMAT
61
+ file_type(file) != Format::UNKNOWN
51
62
  end
52
63
 
53
64
  # Detect file type by read file header
54
65
  #
55
66
  # TODO: This can be better solution, if anyone knows, tell me please.
56
67
  def file_type(file)
57
- header_hex = File.read(file, 100)
58
- type = if header_hex =~ /^\x50\x4b\x03\x04/
59
- detect_zip_file(file)
60
- else
61
- detect_mobileprovision(header_hex)
62
- end
63
-
64
- type || UNKNOWN_FORMAT
68
+ header_hex = ::File.read(file, 100)
69
+ case header_hex
70
+ when ZIP_RETGEX
71
+ detect_zip_file(file)
72
+ when PE_REGEX
73
+ Format::PE
74
+ when PLIST_REGEX, BPLIST_REGEX
75
+ Format::MOBILEPROVISION
76
+ else
77
+ Format::UNKNOWN
78
+ end
79
+ end
80
+
81
+ def logger
82
+ @logger ||= Logger.new($stdout, level: :warn)
65
83
  end
66
84
 
85
+ attr_writer :logger
86
+
67
87
  private
68
88
 
69
89
  # :nodoc:
@@ -71,35 +91,59 @@ module AppInfo
71
91
  Zip.warn_invalid_date = false
72
92
  zip_file = Zip::File.open(file)
73
93
 
74
- return :proguard unless zip_file.glob('*mapping*.txt').empty?
75
- return :apk if !zip_file.find_entry('AndroidManifest.xml').nil? &&
76
- !zip_file.find_entry('classes.dex').nil?
94
+ return Format::PROGUARD if proguard_clues?(zip_file)
95
+ return Format::APK if apk_clues?(zip_file)
96
+ return Format::AAB if aab_clues?(zip_file)
97
+ return Format::MACOS if macos_clues?(zip_file)
98
+ return Format::PE if pe_clues?(zip_file)
99
+ return Format::UNKNOWN unless clue = other_clues?(zip_file)
77
100
 
78
- return :aab if !zip_file.find_entry('base/manifest/AndroidManifest.xml').nil? &&
79
- !zip_file.find_entry('BundleConfig.pb').nil?
101
+ clue
102
+ ensure
103
+ zip_file.close
104
+ end
105
+
106
+ # :nodoc:
107
+ def proguard_clues?(zip_file)
108
+ !zip_file.glob('*mapping*.txt').empty?
109
+ end
80
110
 
81
- return :macos if !zip_file.glob('*/Contents/MacOS/*').empty? &&
82
- !zip_file.glob('*/Contents/Info.plist').empty?
111
+ # :nodoc:
112
+ def apk_clues?(zip_file)
113
+ !zip_file.find_entry('AndroidManifest.xml').nil? &&
114
+ !zip_file.find_entry('classes.dex').nil?
115
+ end
83
116
 
84
- zip_file.each do |f|
85
- path = f.name
117
+ # :nodoc:
118
+ def aab_clues?(zip_file)
119
+ !zip_file.find_entry('base/manifest/AndroidManifest.xml').nil? &&
120
+ !zip_file.find_entry('BundleConfig.pb').nil?
121
+ end
86
122
 
87
- return :ipa if path.include?('Payload/') && path.end_with?('Info.plist')
88
- return :dsym if path.include?('Contents/Resources/DWARF/')
89
- end
90
- ensure
91
- zip_file.close
123
+ # :nodoc:
124
+ def macos_clues?(zip_file)
125
+ !zip_file.glob('*/Contents/MacOS/*').empty? &&
126
+ !zip_file.glob('*/Contents/Info.plist').empty?
92
127
  end
93
128
 
94
- PLIST_REGEX = /\x3C\x3F\x78\x6D\x6C/.freeze
95
- BPLIST_REGEX = /^\x62\x70\x6C\x69\x73\x74/.freeze
129
+ # :nodoc:
130
+ def pe_clues?(zip_file)
131
+ !zip_file.glob('*.exe').empty?
132
+ end
96
133
 
97
134
  # :nodoc:
98
- def detect_mobileprovision(hex)
99
- case hex
100
- when PLIST_REGEX, BPLIST_REGEX
101
- :mobileprovision
135
+ def other_clues?(zip_file)
136
+ zip_file.each do |f|
137
+ path = f.name
138
+
139
+ return Format::IPA if path.include?('Payload/') && path.end_with?('Info.plist')
140
+ return Format::DSYM if path.include?('Contents/Resources/DWARF/')
102
141
  end
103
142
  end
104
143
  end
144
+
145
+ ZIP_RETGEX = /^\x50\x4b\x03\x04/.freeze
146
+ PE_REGEX = /^MZ/.freeze
147
+ PLIST_REGEX = /\x3C\x3F\x78\x6D\x6C/.freeze
148
+ BPLIST_REGEX = /^\x62\x70\x6C\x69\x73\x74/.freeze
105
149
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: app-info
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.5
4
+ version: 3.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - icyleaf
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-16 00:00:00.000000000 Z
11
+ date: 2023-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: CFPropertyList
@@ -76,14 +76,14 @@ dependencies:
76
76
  requirements:
77
77
  - - "~>"
78
78
  - !ruby/object:Gem::Version
79
- version: 2.5.1
79
+ version: 2.6.0
80
80
  type: :runtime
81
81
  prerelease: false
82
82
  version_requirements: !ruby/object:Gem::Requirement
83
83
  requirements:
84
84
  - - "~>"
85
85
  - !ruby/object:Gem::Version
86
- version: 2.5.1
86
+ version: 2.6.0
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: rubyzip
89
89
  requirement: !ruby/object:Gem::Requirement
@@ -138,6 +138,20 @@ dependencies:
138
138
  - - "~>"
139
139
  - !ruby/object:Gem::Version
140
140
  version: 0.2.0
141
+ - !ruby/object:Gem::Dependency
142
+ name: pedump
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: 0.6.2
148
+ type: :runtime
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: 0.6.2
141
155
  - !ruby/object:Gem::Dependency
142
156
  name: google-protobuf
143
157
  requirement: !ruby/object:Gem::Requirement
@@ -186,34 +200,6 @@ dependencies:
186
200
  - - ">="
187
201
  - !ruby/object:Gem::Version
188
202
  version: '10.0'
189
- - !ruby/object:Gem::Dependency
190
- name: rspec
191
- requirement: !ruby/object:Gem::Requirement
192
- requirements:
193
- - - "~>"
194
- - !ruby/object:Gem::Version
195
- version: '3.0'
196
- type: :development
197
- prerelease: false
198
- version_requirements: !ruby/object:Gem::Requirement
199
- requirements:
200
- - - "~>"
201
- - !ruby/object:Gem::Version
202
- version: '3.0'
203
- - !ruby/object:Gem::Dependency
204
- name: rubocop
205
- requirement: !ruby/object:Gem::Requirement
206
- requirements:
207
- - - "~>"
208
- - !ruby/object:Gem::Version
209
- version: '1.19'
210
- type: :development
211
- prerelease: false
212
- version_requirements: !ruby/object:Gem::Requirement
213
- requirements:
214
- - - "~>"
215
- - !ruby/object:Gem::Version
216
- version: '1.19'
217
203
  description: Teardown tool for ipa/apk files and dSYM file, even support for info.plist
218
204
  and .mobileprovision files
219
205
  email:
@@ -240,19 +226,39 @@ files:
240
226
  - lib/app-info.rb
241
227
  - lib/app_info.rb
242
228
  - lib/app_info/aab.rb
229
+ - lib/app_info/android.rb
230
+ - lib/app_info/android/signature.rb
231
+ - lib/app_info/android/signatures/base.rb
232
+ - lib/app_info/android/signatures/info.rb
233
+ - lib/app_info/android/signatures/v1.rb
234
+ - lib/app_info/android/signatures/v2.rb
235
+ - lib/app_info/android/signatures/v3.rb
236
+ - lib/app_info/android/signatures/v4.rb
243
237
  - lib/app_info/apk.rb
238
+ - lib/app_info/apple.rb
239
+ - lib/app_info/certificate.rb
240
+ - lib/app_info/const.rb
244
241
  - lib/app_info/core_ext.rb
245
242
  - lib/app_info/core_ext/object/try.rb
246
243
  - lib/app_info/core_ext/string/inflector.rb
247
244
  - lib/app_info/dsym.rb
245
+ - lib/app_info/dsym/debug_info.rb
246
+ - lib/app_info/dsym/macho.rb
248
247
  - lib/app_info/error.rb
248
+ - lib/app_info/file.rb
249
249
  - lib/app_info/helper.rb
250
+ - lib/app_info/helper/archive.rb
251
+ - lib/app_info/helper/file_size.rb
252
+ - lib/app_info/helper/generate_class.rb
253
+ - lib/app_info/helper/protobuf.rb
254
+ - lib/app_info/helper/signatures.rb
250
255
  - lib/app_info/info_plist.rb
251
256
  - lib/app_info/ipa.rb
252
257
  - lib/app_info/ipa/framework.rb
253
258
  - lib/app_info/ipa/plugin.rb
254
259
  - lib/app_info/macos.rb
255
260
  - lib/app_info/mobile_provision.rb
261
+ - lib/app_info/pe.rb
256
262
  - lib/app_info/png_uncrush.rb
257
263
  - lib/app_info/proguard.rb
258
264
  - lib/app_info/protobuf/manifest.rb
@@ -268,7 +274,14 @@ homepage: http://github.com/icyleaf/app-info
268
274
  licenses:
269
275
  - MIT
270
276
  metadata: {}
271
- post_install_message:
277
+ post_install_message: |
278
+ AppInfo 3.0 is coming!
279
+ **********************
280
+ The public API of some AppInfo classes has been changed.
281
+
282
+ Please ensure that your Gemfiles and .gemspecs are suitably restrictive
283
+ to avoid an unexpected breakage when 3.0 is released (e.g. ~> 2.8.5).
284
+ See https://github.com/icyleaf/app_info for details.
272
285
  rdoc_options: []
273
286
  require_paths:
274
287
  - lib
@@ -279,9 +292,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
279
292
  version: '2.5'
280
293
  required_rubygems_version: !ruby/object:Gem::Requirement
281
294
  requirements:
282
- - - ">="
295
+ - - ">"
283
296
  - !ruby/object:Gem::Version
284
- version: '0'
297
+ version: 1.3.1
285
298
  requirements: []
286
299
  rubygems_version: 3.4.1
287
300
  signing_key: