cocoapods-privacy 0.1.8 → 0.2.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 +4 -4
- data/lib/cocoapods-privacy/gem_version.rb +1 -1
- data/lib/cocoapods-privacy/privacy/PrivacyHunter.rb +69 -41
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 764dcd8e0be43bcb5ca3309ba79d166d19a3ac25ea641c397cc6cc66b9622f61
|
4
|
+
data.tar.gz: 1a4724dcc2a679182539db7f04901311b520c3e4dd2fee94f23b6aad6521ad43
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29d51dce9a7bafb95aab4e5c0afd66357c66f540a30c031cdaece060b2eb7e7f2bb2b8ce80bc20315a4b2aac9ce7f639f742551167e6cdf8fc0e2160ae87a22f
|
7
|
+
data.tar.gz: 94fad012858ccbdd2080ae9ae3c2c9ea7b964c8d2c3bdda980f902fa2c47c78a4646e5a0eaff754c86e01c95d2e11f6c0725e5a4db380c7aed4a7931b85469c9
|
@@ -14,51 +14,65 @@ module PrivacyHunter
|
|
14
14
|
KReasons = "NSPrivacyAccessedAPITypeReasons"
|
15
15
|
KAPI = "NSPrivacyAccessedAPI"
|
16
16
|
|
17
|
-
|
18
|
-
# privacyInfo_file = ARGV[1]#传入目标 PrivacyInfo.xcprivacy
|
19
|
-
|
20
|
-
def self.search_pricacy_apis(source_folders)
|
21
|
-
# #读取源文件,也就是搜索目标文件
|
22
|
-
# source_folders = source_files.split(",")
|
17
|
+
def self.formatter_privacy_template()
|
23
18
|
#模版数据源plist文件
|
24
19
|
template_plist_file = fetch_template_plist_file()
|
25
20
|
|
26
21
|
# 读取并解析 数据源 plist 文件
|
27
22
|
json_str = `plutil -convert json -o - "#{template_plist_file}"`.chomp
|
28
23
|
map = JSON.parse(json_str)
|
29
|
-
|
24
|
+
type_datas = map[KTypes]
|
30
25
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
privacyDict = {}
|
26
|
+
apis = {}
|
27
|
+
keyword_type_map = {} #{systemUptime:NSPrivacyAccessedAPICategorySystemBootTime,mach_absolute_time:NSPrivacyAccessedAPICategorySystemBootTime .....}
|
28
|
+
type_datas.each do |value|
|
35
29
|
type = value[KType]
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
if search_files(source_folders, s_key)
|
40
|
-
s_vlaue_split = s_value.split(',')
|
41
|
-
reasons += s_vlaue_split
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
#按照隐私清单拼接数据
|
46
|
-
reasons = reasons.uniq
|
47
|
-
if !reasons.empty?
|
48
|
-
privacyDict[KType] = type
|
49
|
-
privacyDict[KReasons] = reasons
|
50
|
-
privacyArr.push(privacyDict)
|
30
|
+
apis_inner = value[KAPI]
|
31
|
+
apis_inner.each do |keyword, reason|
|
32
|
+
keyword_type_map[keyword] = type
|
51
33
|
end
|
52
|
-
|
53
|
-
|
34
|
+
apis = apis.merge(apis_inner)
|
35
|
+
end
|
36
|
+
[apis,keyword_type_map]
|
37
|
+
end
|
54
38
|
|
39
|
+
def self.search_pricacy_apis(source_folders)
|
40
|
+
apis,keyword_type_map = formatter_privacy_template()
|
41
|
+
|
42
|
+
# 优化写法,一次循环完成所有查询
|
43
|
+
datas = []
|
44
|
+
apis_found = search_files(source_folders, apis)
|
45
|
+
unless apis_found.empty?
|
46
|
+
apis_found.each do |keyword,reason|
|
47
|
+
reasons = reason.split(',')
|
48
|
+
type = keyword_type_map[keyword]
|
49
|
+
|
50
|
+
# 如果有数据 给data增加reasons
|
51
|
+
datas.map! do |data|
|
52
|
+
if data[KType] == type
|
53
|
+
data[KReasons] += reasons
|
54
|
+
data[KReasons] = data[KReasons].uniq
|
55
|
+
end
|
56
|
+
data
|
57
|
+
end
|
58
|
+
|
59
|
+
# 如果没数据,新建data
|
60
|
+
unless datas.any? { |data| data[KType] == type }
|
61
|
+
data = {}
|
62
|
+
data[KType] = type
|
63
|
+
data[KReasons] ||= []
|
64
|
+
data[KReasons] += reasons
|
65
|
+
data[KReasons] = data[KReasons].uniq
|
66
|
+
datas.push(data)
|
67
|
+
end
|
68
|
+
end
|
55
69
|
end
|
56
70
|
|
57
71
|
# 打印出搜索结果
|
58
|
-
puts
|
72
|
+
puts datas
|
59
73
|
|
60
74
|
# 转换成 JSON 字符串
|
61
|
-
json_data =
|
75
|
+
json_data = datas.to_json
|
62
76
|
end
|
63
77
|
|
64
78
|
|
@@ -172,28 +186,42 @@ module PrivacyHunter
|
|
172
186
|
end
|
173
187
|
|
174
188
|
# 文件是否包含内容
|
175
|
-
def self.
|
176
|
-
File.read(file_path)
|
189
|
+
def self.contains_apis?(file_path, apis)
|
190
|
+
file_content = File.read(file_path)
|
191
|
+
apis_found = {}
|
192
|
+
apis.each do |keyword, value|
|
193
|
+
if file_content.include?(keyword)
|
194
|
+
apis_found[keyword] = value
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
apis_found
|
177
199
|
end
|
178
200
|
|
179
201
|
#搜索所有子文件夹
|
180
|
-
def self.search_files(folder_paths,
|
202
|
+
def self.search_files(folder_paths, apis)
|
181
203
|
|
182
204
|
# 获取文件夹下所有文件(包括子文件夹)
|
183
205
|
all_files = []
|
184
206
|
folder_paths.each do |folder|
|
185
|
-
|
186
|
-
|
187
|
-
|
207
|
+
# 不再做额外格式过滤,避免和podspec中source_files 自带的格式冲突
|
208
|
+
# allowed_extensions = ['m', 'c', 'swift', 'mm', 'hap', 'cpp']
|
209
|
+
# pattern = File.join(folder, '**', '*.{'+allowed_extensions.join(',')+'}')
|
210
|
+
# all_files += Dir.glob(pattern, File::FNM_DOTMATCH).reject { |file| File.directory?(file) }
|
211
|
+
|
212
|
+
# 使用 Dir.glob 方法直接获取符合条件的文件路径
|
213
|
+
files_in_folder = Dir.glob(folder, File::FNM_DOTMATCH)
|
214
|
+
|
215
|
+
# 过滤掉目录路径,只保留文件路径,并将其添加到 all_files 数组中
|
216
|
+
all_files += files_in_folder.reject { |file| File.directory?(file) }
|
188
217
|
end
|
189
218
|
# 遍历文件进行检索
|
219
|
+
apis_found = {}
|
190
220
|
all_files.uniq.each_with_index do |file_path, index|
|
191
|
-
|
192
|
-
|
193
|
-
return true
|
194
|
-
end
|
221
|
+
apis_found = apis_found.merge(contains_apis?(file_path, apis))
|
222
|
+
puts "File #{file_path} contains the keyword '#{apis_found.keys}'." unless apis_found.empty?
|
195
223
|
end
|
196
|
-
|
224
|
+
apis_found
|
197
225
|
end
|
198
226
|
end
|
199
227
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods-privacy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- youhui
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|