headdesk 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Headdesk
4
+ #
5
+ # Descriptions for APK methods
6
+ #
7
+ # :reek:RepeatedConditional
8
+ class APKDescriber
9
+ def initialize(mode)
10
+ @unless = (mode == :unless)
11
+ end
12
+
13
+ def class?(decl)
14
+ "APK #{@unless ? 'contains' : 'does not contain'} class #{decl.tr('/', '.')}"
15
+ end
16
+
17
+ def targets_sdk(gt_eq)
18
+ "APK targets API #{@unless ? '>=' : '<'} #{gt_eq}"
19
+ end
20
+
21
+ def min_sdk(gt_eq)
22
+ "APK requires #{@unless ? 'at least' : 'less than'} API #{gt_eq}"
23
+ end
24
+ end
25
+
26
+ #
27
+ # Turn parameters passed skip_check and fail_check into descriptions
28
+ #
29
+ class Descriptionator
30
+ attr_reader :apk
31
+
32
+ def initialize(mode)
33
+ @apk = APKDescriber.new(mode)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+ require 'json'
5
+
6
+ module Headdesk
7
+ #
8
+ # Descriptions for APK methods
9
+ #
10
+ class Report
11
+ attr_reader :apk, :ipa, :bundle_id, :file_name, :android_sdk, :checks
12
+
13
+ def initialize
14
+ @checks = []
15
+ end
16
+
17
+ def <<(value)
18
+ @checks << value
19
+ end
20
+
21
+ def icon_for_status
22
+ {
23
+ success: '✔',
24
+ fail: '✘',
25
+ skip: '⇣'
26
+ }
27
+ end
28
+
29
+ def color_for_status
30
+ {
31
+ success: "\e[32m%s\e[0m",
32
+ fail: "\e[31m%s\e[0m",
33
+ skip: "\e[36m%s\e[0m"
34
+ }
35
+ end
36
+
37
+ def to_s
38
+ ERB.new(<<~DESCRIPTION, nil, '>').result(binding)
39
+ Bundle Id: <%= bundle_id %>\n
40
+ <%= describe %>\n
41
+ <% for @check in checks %>
42
+ <%= color_for_status[@check[:status]] % icon_for_status[@check[:status]] %> <%= color_for_status[@check[:status]] % @check[:description] %>\n
43
+ <% for @step in @check[:steps] %>
44
+ ↳ <%= color_for_status[@step[:status]] % icon_for_status[@step[:status]] %> <%= color_for_status[@step[:status]] % @step[:description] %>\n
45
+ <% end %>
46
+ <% unless @check[:export].empty? %><%= " 💾 " + @check[:export].to_json + "\n" %><% end %>\n
47
+ <% end %>
48
+ DESCRIPTION
49
+ end
50
+
51
+ def to_h
52
+ {
53
+ bundle_id: bundle_id,
54
+ file_name: file_name,
55
+ checks: checks
56
+ }
57
+ end
58
+
59
+ def to_json
60
+ to_h.to_json
61
+ end
62
+
63
+ def describe; end
64
+ end
65
+
66
+ #
67
+ # Report from an APK analysis
68
+ #
69
+ class APKReport < Report
70
+ def initialize(apk)
71
+ super()
72
+ @bundle_id = apk.android_manifest.xpath('//manifest').first.attributes['package']
73
+ @file_name = apk.yaml['apkFileName']
74
+ @android_sdk = apk.sdk_info
75
+ end
76
+
77
+ def describe
78
+ <<~DESCRIPTION
79
+ minSdkVersion: #{@android_sdk['minSdkVersion']}
80
+ targetSdkVersion: #{@android_sdk['targetSdkVersion']}
81
+ DESCRIPTION
82
+ end
83
+
84
+ def to_h
85
+ super.merge(
86
+ apk: true,
87
+ android_sdk: 'foo'
88
+ )
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Headdesk
4
+ APKTOOL_VERSION = '2.3.4'
5
+ VERSION = '0.1.0'
6
+ end
metadata ADDED
@@ -0,0 +1,180 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: headdesk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Pat Wilson
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-01-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: reek
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: awesome_print
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: nokogiri
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: thor
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: ''
112
+ email:
113
+ - pat@teak.io
114
+ executables:
115
+ - headdesk
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - ".reek.yml"
121
+ - ".ruby-gemset"
122
+ - ".ruby-version"
123
+ - Gemfile
124
+ - Gemfile.lock
125
+ - LICENSE.txt
126
+ - README.md
127
+ - Rakefile
128
+ - bin/console
129
+ - bin/facebook_sdk_versions
130
+ - bin/setup
131
+ - exe/headdesk
132
+ - ext/apktool_2.3.4.jar
133
+ - headdesk.gemspec
134
+ - lib/headdesk.rb
135
+ - lib/headdesk/analize.rb
136
+ - lib/headdesk/apk.rb
137
+ - lib/headdesk/apk/class.rb
138
+ - lib/headdesk/apk/field.rb
139
+ - lib/headdesk/apk/method.rb
140
+ - lib/headdesk/apk/resources.rb
141
+ - lib/headdesk/apktool.rb
142
+ - lib/headdesk/check.rb
143
+ - lib/headdesk/checks/api26.rb
144
+ - lib/headdesk/checks/facebook.rb
145
+ - lib/headdesk/checks/receiver.rb
146
+ - lib/headdesk/checks/teak.rb
147
+ - lib/headdesk/checks/teak/api21_icon.rb
148
+ - lib/headdesk/checks/teak/caching.rb
149
+ - lib/headdesk/checks/teak/teak.rb
150
+ - lib/headdesk/cli.rb
151
+ - lib/headdesk/data/facebook_sdk_versions.yaml
152
+ - lib/headdesk/descriptionator.rb
153
+ - lib/headdesk/report.rb
154
+ - lib/headdesk/version.rb
155
+ homepage: https://github.com/GoCarrot/headdesk
156
+ licenses:
157
+ - MIT
158
+ metadata: {}
159
+ post_install_message:
160
+ rdoc_options: []
161
+ require_paths:
162
+ - lib
163
+ required_ruby_version: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ required_rubygems_version: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ requirements: []
174
+ rubyforge_project:
175
+ rubygems_version: 2.6.10
176
+ signing_key:
177
+ specification_version: 4
178
+ summary: headdesk helps identify and solve common issues in mobile development by
179
+ analizing APKs and IPAs.
180
+ test_files: []