howsigned 0.0.5 → 0.0.6

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: cf4dd4a0deaac92e79d35420262f1a0dfa1d773d
4
- data.tar.gz: baa4a3d7c1983d2b2b6de872372b0163db049984
3
+ metadata.gz: 17c40520b69c7b9f1fb516b1a66accb3697cc921
4
+ data.tar.gz: e781a50820c86c58b5abadbf4ad9d5c6dade1881
5
5
  SHA512:
6
- metadata.gz: 6aa842ee204e2e15164f1f2b522d9a914a3d75bb031a13f7d56096065c0721ba0aec917c29eb6dec1d3b725e74c29046d5439b88142679bfeb2fcc11aa7d2eb8
7
- data.tar.gz: beccc641dd70075e5e1f0710992d40f2c744868f2c7feb600cb8e21ed493c982fdf09e84e998c951c274d4d8951695039aafb9b62fa7569ce48f40df330bb234
6
+ metadata.gz: 295222840b8ecfb190216b2c04fe1767771649078c1ddd4329efe8381327322c295e7e2a47dfed7ff767b150933f40937ec2b938d82900567563adce32bc8d1e
7
+ data.tar.gz: b205ccc89dee8ea4ef5dbfee027a85a3b20bc888c97d36fedc7f63b289945e7fb771cb83f6070f7b2bae2856a125c948e4b5b467e0a5b9c8f888a8a93a2e083c
data/bin/howsigned CHANGED
@@ -6,7 +6,8 @@ require 'commander/import'
6
6
  require 'entitlements'
7
7
  require 'profiles'
8
8
  require 'verify'
9
+ require 'compare'
9
10
 
10
- program :version, '0.0.5'
11
+ program :version, '0.0.6'
11
12
  program :description, 'Utility to determine codesigning on contained binaries in an .ipa'
12
13
 
data/lib/compare.rb ADDED
@@ -0,0 +1,49 @@
1
+ require 'plist'
2
+ require 'zip'
3
+ require 'zip/filesystem'
4
+ require 'validate_ipa'
5
+ require 'extract_zip'
6
+ require 'entitlements'
7
+ require 'profiles'
8
+
9
+ def write_plist_to_path(plist, path)
10
+ File.write(path, plist)
11
+ end
12
+
13
+ command :compare do |c|
14
+ c.syntax = 'howsigned entitlements [.ipa file]'
15
+ c.description = 'Prints entitlements of specified .ipa in plist format'
16
+ c.action do |args, options|
17
+ first_file = validate_ipa(args.pop)
18
+ second_file = validate_ipa(args.pop)
19
+
20
+ first_tempdir = ::File.new(Dir.mktmpdir)
21
+ extract_zip(first_file, first_tempdir)
22
+
23
+ second_tempdir = ::File.new(Dir.mktmpdir)
24
+ extract_zip(second_file, second_tempdir)
25
+
26
+ first_entitlements = get_entitlements(first_tempdir.path)
27
+ second_entitlements = get_entitlements(second_tempdir.path)
28
+
29
+ first_profiles = get_profiles(first_tempdir.path)
30
+ second_profiles = get_profiles(second_tempdir.path)
31
+
32
+ temp_plist_dir = ::File.new(Dir.mktmpdir).path
33
+ write_plist_to_path(first_entitlements, "#{temp_plist_dir}/entitlements1.plist")
34
+ write_plist_to_path(second_entitlements, "#{temp_plist_dir}/entitlements2.plist")
35
+ write_plist_to_path(first_profiles, "#{temp_plist_dir}/profiles1.plist")
36
+ write_plist_to_path(second_profiles, "#{temp_plist_dir}/profiles2.plist")
37
+
38
+ entitlements_diff = `diff "#{temp_plist_dir}/entitlements1.plist" "#{temp_plist_dir}/entitlements2.plist"`
39
+ profiles_diff = `diff "#{temp_plist_dir}/profiles1.plist" "#{temp_plist_dir}/profiles2.plist"`
40
+
41
+ if (entitlements_diff.length > 0)
42
+ puts entitlements_diff
43
+ end
44
+
45
+ if (profiles_diff.length > 0)
46
+ puts profiles_diff
47
+ end
48
+ end
49
+ end
data/lib/entitlements.rb CHANGED
@@ -9,35 +9,42 @@ require 'extract_zip'
9
9
  require 'contained_binaries_definition'
10
10
 
11
11
  def append_entitlements(path, entitlements_hash)
12
+ index = 0
12
13
  Dir.glob(path) do |file|
13
14
  entitlements = `codesign -d --entitlements :- "#{file}" 2>&1`
14
15
  plist_entitlements = Plist::parse_xml(entitlements)
15
- application_identifier = plist_entitlements["application-identifier"]
16
- entitlements_hash[application_identifier] = plist_entitlements
16
+ if (plist_entitlements)
17
+ application_identifier = plist_entitlements["application-identifier"] ? plist_entitlements["application-identifier"] : index.to_s
18
+ entitlements_hash[application_identifier] = plist_entitlements
19
+ index = index + 1
20
+ end
17
21
  end
18
22
  end
19
23
 
20
- command :entitlements do |c|
21
- c.syntax = 'howsigned entitlements [.ipa file]'
22
- c.description = 'Prints entitlements of specified .ipa in plist format'
23
- c.action do |args, options|
24
- validate_ipa! unless @file = args.pop
25
- puts "Missing or unspecified .ipa file" and abort unless @file and ::File.exist?(@file)
26
-
27
- tempdir = ::File.new(Dir.mktmpdir)
28
- extract_zip(@file, tempdir)
29
-
24
+ def get_entitlements(tempdir_path)
30
25
  entitlements_hash = Hash.new
31
26
 
32
27
  contained_binary_extensions().each { |extension|
33
- append_entitlements("#{tempdir.path}/**/*.#{extension}", entitlements_hash)
28
+ append_entitlements("#{tempdir_path}/**/*.#{extension}", entitlements_hash)
34
29
  }
35
30
 
36
31
  if (entitlements_hash.length == 0)
37
32
  abort "No entitlements found on contained binaries"
38
33
  end
39
34
 
40
- puts entitlements_hash.to_plist
35
+ return entitlements_hash.to_plist
36
+ end
37
+
38
+ command :entitlements do |c|
39
+ c.syntax = 'howsigned entitlements [.ipa file]'
40
+ c.description = 'Prints entitlements of specified .ipa in plist format'
41
+ c.action do |args, options|
42
+ file = validate_ipa(args.pop)
43
+
44
+ tempdir = ::File.new(Dir.mktmpdir)
45
+ extract_zip(file, tempdir)
46
+
47
+ puts get_entitlements(tempdir.path)
41
48
  end
42
49
  end
43
50
 
data/lib/profiles.rb CHANGED
@@ -4,13 +4,22 @@ require 'zip/filesystem'
4
4
  require 'validate_ipa'
5
5
  require 'extract_zip'
6
6
 
7
- def get_profiles(path)
7
+ def get_profiles(tempdir_path, only_expiration)
8
+ path = "#{tempdir_path}/**/*.mobileprovision"
8
9
  profiles = Hash.new
10
+ index = 0
9
11
  Dir.glob(path) do |file|
10
12
  profile = `security cms -D -i "#{file}" 2>&1`
11
13
  plist_profile = Plist::parse_xml(profile)
12
- app_id = plist_profile["AppIDName"]
13
- profiles[app_id] = plist_profile
14
+ if plist_profile
15
+ app_id = plist_profile["AppIDName"] ? plist_profile["AppIDName"] : index.to_s
16
+ if only_expiration
17
+ profiles[app_id] = plist_profile["ExpirationDate"]
18
+ else
19
+ profiles[app_id] = plist_profile
20
+ end
21
+ index = index + 1
22
+ end
14
23
  end
15
24
 
16
25
  if (profiles.length == 0)
@@ -22,14 +31,15 @@ end
22
31
  command :profiles do |c|
23
32
  c.syntax = 'howsigned profiles [.ipa file]'
24
33
  c.description = 'Prints embedded profiles of specified .ipa in plist format'
34
+ c.option '--expiration', "When specified, will print only the expiration dates of embedded profiles"
25
35
  c.action do |args, options|
26
- validate_ipa! unless @file = args.pop
27
- puts "Missing or unspecified .ipa file" and abort unless @file and ::File.exist?(@file)
36
+ file = validate_ipa(args.pop)
37
+ only_expiration = options.expiration || false
28
38
 
29
39
  tempdir = ::File.new(Dir.mktmpdir)
30
- extract_zip(@file, tempdir)
40
+ extract_zip(file, tempdir)
31
41
 
32
- puts get_profiles("#{tempdir.path}/**/*.mobileprovision")
42
+ puts get_profiles(tempdir.path, only_expiration)
33
43
  end
34
44
  end
35
45
 
data/lib/validate_ipa.rb CHANGED
@@ -1,9 +1,4 @@
1
- def validate_ipa!
2
- files = Dir['*.ipa']
3
- @file ||= case files.length
4
- when 0 then nil
5
- when 1 then files.first
6
- else
7
- @file = choose "Select an .ipa", *files
8
- end
1
+ def validate_ipa(file)
2
+ puts "Missing or unspecified .ipa file" and abort unless file and ::File.exist?(file)
3
+ return file
9
4
  end
data/lib/verify.rb CHANGED
@@ -18,11 +18,10 @@ command :verify do |c|
18
18
  c.syntax = 'howsigned verify [.ipa file]'
19
19
  c.description = 'Verifies the code signature of all binaries contained within the .ipa, will return nothing if signed correctly'
20
20
  c.action do |args, options|
21
- validate_ipa! unless @file = args.pop
22
- puts "Missing or unspecified .ipa file" and abort unless @file and ::File.exist?(@file)
21
+ file = validate_ipa(args.pop)
23
22
 
24
23
  tempdir = ::File.new(Dir.mktmpdir)
25
- extract_zip(@file, tempdir)
24
+ extract_zip(file, tempdir)
26
25
 
27
26
  entitlements_hash = Hash.new
28
27
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: howsigned
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael MacDougall
@@ -60,6 +60,7 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
62
  - bin/howsigned
63
+ - lib/compare.rb
63
64
  - lib/contained_binaries_definition.rb
64
65
  - lib/entitlements.rb
65
66
  - lib/extract_zip.rb