capor 0.0.3 → 0.0.4
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/.gitignore +50 -0
- data/README.md +1 -0
- data/bin/capor +4 -0
- data/capor.gemspec +30 -0
- data/lib/capor/info.rb +109 -0
- data/lib/capor/profile.rb +133 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3be9c92d8108fd930436d34a98bd3bb8f8cc2dc9
|
4
|
+
data.tar.gz: f2dc647b0472d4cc7e1c765c07c2d596234e9fe1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce14415849a9bf4f1b561aa017d9dd24688bbe020fb26d6ce0063e7bd5c9a1dde89bb4eff9d822ae0d03953924b6bc290dae460b5d484923c184689a687ce5f2
|
7
|
+
data.tar.gz: 2a9adc5b5a1cf3b6c421c89e54f22cb8779de55358ecd9944f0ba04af8aa37ddc83bded9b1d85eacbdcfb359bdadf1ef7c8de4d6f3aa243b743798f43c30ba72
|
data/.gitignore
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/spec/examples.txt
|
9
|
+
/test/tmp/
|
10
|
+
/test/version_tmp/
|
11
|
+
/tmp/
|
12
|
+
|
13
|
+
# Used by dotenv library to load environment variables.
|
14
|
+
# .env
|
15
|
+
|
16
|
+
## Specific to RubyMotion:
|
17
|
+
.dat*
|
18
|
+
.repl_history
|
19
|
+
build/
|
20
|
+
*.bridgesupport
|
21
|
+
build-iPhoneOS/
|
22
|
+
build-iPhoneSimulator/
|
23
|
+
|
24
|
+
## Specific to RubyMotion (use of CocoaPods):
|
25
|
+
#
|
26
|
+
# We recommend against adding the Pods directory to your .gitignore. However
|
27
|
+
# you should judge for yourself, the pros and cons are mentioned at:
|
28
|
+
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
29
|
+
#
|
30
|
+
# vendor/Pods/
|
31
|
+
|
32
|
+
## Documentation cache and generated files:
|
33
|
+
/.yardoc/
|
34
|
+
/_yardoc/
|
35
|
+
/doc/
|
36
|
+
/rdoc/
|
37
|
+
|
38
|
+
## Environment normalization:
|
39
|
+
/.bundle/
|
40
|
+
/vendor/bundle
|
41
|
+
/lib/bundler/man/
|
42
|
+
|
43
|
+
# for a library or gem, you might want to ignore these files since the code is
|
44
|
+
# intended to run in multiple environments; otherwise, check them in:
|
45
|
+
# Gemfile.lock
|
46
|
+
# .ruby-version
|
47
|
+
# .ruby-gemset
|
48
|
+
|
49
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
50
|
+
.rvmrc
|
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
> Capor is command line tool for parser iOS .ipa file, you cat the ipa package info like cat a file.
|
data/bin/capor
ADDED
data/capor.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
Gem::Specification.new do |s|
|
3
|
+
s.name = 'capor'
|
4
|
+
s.version = '0.0.4'
|
5
|
+
s.date = '2017-05-07'
|
6
|
+
s.summary = 'Capor is command line tool for parser iOS .ipa file.'
|
7
|
+
s.description = 'Capor is command line tool for parser iOS .ipa file, you cat the ipa package info like cat a file.'
|
8
|
+
s.author = 'Gump Wang'
|
9
|
+
s.email = '1989wg@gmail.com'
|
10
|
+
s.license = 'MIT'
|
11
|
+
s.homepage = 'https://www.github.com/wanggang316/capor'
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
s.add_dependency 'commander', '~> 4.3'
|
16
|
+
s.add_dependency 'rubyzip', '~> 1.0', '>= 1.0.0'
|
17
|
+
s.add_dependency 'plist', '~> 3.3'
|
18
|
+
s.add_dependency 'terminal-table', '~> 1.7', '>= 1.7.3'
|
19
|
+
s.add_dependency 'CFPropertyList', '~> 2.3'
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
s.bindir = 'bin'
|
24
|
+
s.files = `git ls-files -z`.split("\x0")
|
25
|
+
s.require_paths = ["lib"]
|
26
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
end
|
data/lib/capor/info.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'commander/import'
|
4
|
+
require 'zip'
|
5
|
+
require 'zip/filesystem'
|
6
|
+
require 'terminal-table'
|
7
|
+
require 'cfpropertylist'
|
8
|
+
|
9
|
+
program :name, 'capor'
|
10
|
+
program :version, '0.0.1'
|
11
|
+
program :description, 'Get ipa info'
|
12
|
+
program :help, 'Author', 'gumpwang <gumpwang2016@gmail.com>'
|
13
|
+
|
14
|
+
|
15
|
+
command :info do |c|
|
16
|
+
c.syntax = 'capor info [options]'
|
17
|
+
c.summary = 'this is summary add by summary'
|
18
|
+
c.description = 'this is the description add by wanggang'
|
19
|
+
c.example 'description', 'command example'
|
20
|
+
|
21
|
+
c.action do |args, options|
|
22
|
+
determine_file! unless @file = args.pop
|
23
|
+
say_error "Missing or unspecified .ipa file" and abort unless @file and ::File.exist?(@file)
|
24
|
+
|
25
|
+
# say @file
|
26
|
+
|
27
|
+
puts "----> #{File.basename(@file, File.extname(@file))}.app"
|
28
|
+
|
29
|
+
# find .app entry
|
30
|
+
Zip::File.open(@file) do |zipfile|
|
31
|
+
puts zipfile
|
32
|
+
app_entry = zipfile.find_entry("Payload/#{File.basename(@file, File.extname(@file))}.app")
|
33
|
+
info_entry = zipfile.find_entry("#{app_entry.name}embedded.mobileprovision") if app_entry
|
34
|
+
|
35
|
+
if (!info_entry)
|
36
|
+
zipfile.dir.entries("Payload").each do |dir_entry|
|
37
|
+
if dir_entry =~ /.app$/
|
38
|
+
say "Using .app: #{dir_entry}"
|
39
|
+
app_entry = zipfile.find_entry("Payload/#{dir_entry}")
|
40
|
+
info_entry = zipfile.find_entry("#{app_entry.name}Info.plist") if app_entry
|
41
|
+
puts "zipname is : #{app_entry}"
|
42
|
+
puts "Info.plist is : #{info_entry}"
|
43
|
+
break
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
say_error "Embedded mobile provisioning file not found in #{@file}" and abort unless info_entry
|
48
|
+
|
49
|
+
|
50
|
+
tempdir = ::File.new(Dir.mktmpdir)
|
51
|
+
|
52
|
+
puts tempdir.path
|
53
|
+
|
54
|
+
begin
|
55
|
+
puts "zipfile is : #{zipfile}"
|
56
|
+
zipfile.each do |zip_entry|
|
57
|
+
temp_entry_path = ::File.join(tempdir.path, zip_entry.name)
|
58
|
+
FileUtils.mkdir_p(::File.dirname(temp_entry_path))
|
59
|
+
zipfile.extract(zip_entry, temp_entry_path) unless ::File.exist?(temp_entry_path)
|
60
|
+
end
|
61
|
+
|
62
|
+
temp_info_plist = ::File.new(::File.join(tempdir.path, info_entry.name))
|
63
|
+
puts "temp_info_plist is : #{temp_info_plist.path}"
|
64
|
+
temp_app_directory = ::File.new(::File.join(tempdir.path, app_entry.name))
|
65
|
+
puts "temp_app_directory is : #{temp_app_directory.path}"
|
66
|
+
|
67
|
+
plist ||= CFPropertyList.native_types(
|
68
|
+
CFPropertyList::List.new(file: temp_info_plist).value)
|
69
|
+
|
70
|
+
table = Terminal::Table.new do |t|
|
71
|
+
plist.each do |key, value|
|
72
|
+
next if key == "DeveloperCertificates"
|
73
|
+
|
74
|
+
columns = []
|
75
|
+
columns << key
|
76
|
+
columns << case value
|
77
|
+
when Hash
|
78
|
+
value.collect{|k, v| "#{k}: #{v}"}.join("\n")
|
79
|
+
when Array
|
80
|
+
value.join("\n")
|
81
|
+
else
|
82
|
+
value.to_s
|
83
|
+
end
|
84
|
+
|
85
|
+
t << columns
|
86
|
+
t << :separator
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
puts table
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
def determine_file!
|
100
|
+
files = Dir['*.ipa']
|
101
|
+
@file ||= case files.length
|
102
|
+
when 0 then nil
|
103
|
+
when 1 then files.first
|
104
|
+
else
|
105
|
+
@file = choose "Select an .ipa File:", *files
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
@@ -0,0 +1,133 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'commander/import'
|
4
|
+
require 'zip'
|
5
|
+
require 'zip/filesystem'
|
6
|
+
require 'plist'
|
7
|
+
require 'terminal-table'
|
8
|
+
|
9
|
+
program :name, 'capor'
|
10
|
+
program :version, '0.0.1'
|
11
|
+
program :description, 'Get ipa info'
|
12
|
+
program :help, 'Author', 'gumpwang <gumpwang2016@gmail.com>'
|
13
|
+
|
14
|
+
|
15
|
+
command :profile do |c|
|
16
|
+
c.syntax = 'capor profile [options]'
|
17
|
+
c.summary = 'this is summary add by summary'
|
18
|
+
c.description = 'this is the description add by wanggang'
|
19
|
+
# password
|
20
|
+
c.example 'description', 'command example'
|
21
|
+
c.option '--some-switch', 'Some switch that does something'
|
22
|
+
|
23
|
+
c.option '--prefix STRING', String, 'Adds a prefix to bar'
|
24
|
+
c.option '--suffix STRING', String, 'Adds a suffix to bar'
|
25
|
+
# choice = choose("Favorite language?", :ruby, :perl, :js)
|
26
|
+
|
27
|
+
c.action do |args, options|
|
28
|
+
# Do something or c.when_called Nopo::Commands::Info
|
29
|
+
# say 'foo'
|
30
|
+
# say args.to_s
|
31
|
+
# say options.to_s
|
32
|
+
# options.default :prefix => '(', :suffix => ')'
|
33
|
+
|
34
|
+
# @file = args.pop
|
35
|
+
determine_file! unless @file = args.pop
|
36
|
+
say_error "Missing or unspecified .ipa file" and abort unless @file and ::File.exist?(@file)
|
37
|
+
|
38
|
+
# say @file
|
39
|
+
|
40
|
+
puts "----> #{File.basename(@file, File.extname(@file))}.app"
|
41
|
+
|
42
|
+
# find .app entry
|
43
|
+
Zip::File.open(@file) do |zipfile|
|
44
|
+
puts zipfile
|
45
|
+
app_entry = zipfile.find_entry("Payload/#{File.basename(@file, File.extname(@file))}.app")
|
46
|
+
provisioning_profile_entry = zipfile.find_entry("#{app_entry.name}embedded.mobileprovision") if app_entry
|
47
|
+
|
48
|
+
if (!provisioning_profile_entry)
|
49
|
+
zipfile.dir.entries("Payload").each do |dir_entry|
|
50
|
+
if dir_entry =~ /.app$/
|
51
|
+
say "Using .app: #{dir_entry}"
|
52
|
+
app_entry = zipfile.find_entry("Payload/#{dir_entry}")
|
53
|
+
provisioning_profile_entry = zipfile.find_entry("#{app_entry.name}embedded.mobileprovision") if app_entry
|
54
|
+
puts "zipname is : #{app_entry}"
|
55
|
+
puts "provisioning_profile_entry is : #{provisioning_profile_entry}"
|
56
|
+
break
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
say_error "Embedded mobile provisioning file not found in #{@file}" and abort unless provisioning_profile_entry
|
61
|
+
|
62
|
+
|
63
|
+
# puts "===> #{Dir.mktmpdir}"
|
64
|
+
tempdir = ::File.new(Dir.mktmpdir)
|
65
|
+
|
66
|
+
puts tempdir.path
|
67
|
+
|
68
|
+
begin
|
69
|
+
puts "zipfile is : #{zipfile}"
|
70
|
+
zipfile.each do |zip_entry|
|
71
|
+
temp_entry_path = ::File.join(tempdir.path, zip_entry.name)
|
72
|
+
FileUtils.mkdir_p(::File.dirname(temp_entry_path))
|
73
|
+
zipfile.extract(zip_entry, temp_entry_path) unless ::File.exist?(temp_entry_path)
|
74
|
+
end
|
75
|
+
|
76
|
+
temp_provisioning_profile = ::File.new(::File.join(tempdir.path, provisioning_profile_entry.name))
|
77
|
+
puts "temp_provisioning_profile is : #{temp_provisioning_profile}"
|
78
|
+
temp_app_directory = ::File.new(::File.join(tempdir.path, app_entry.name))
|
79
|
+
puts "temp_app_directory is : #{temp_app_directory.path}"
|
80
|
+
|
81
|
+
plist = Plist::parse_xml(`security cms -D -i "#{temp_provisioning_profile.path}"`)
|
82
|
+
# puts "---> plist is : #{plist}"
|
83
|
+
|
84
|
+
codesign = `codesign -dv "#{temp_app_directory.path}" 2>&1`
|
85
|
+
puts "---->>>>> codesign is : #{codesign}"
|
86
|
+
codesigned = /Signed Time/ === codesign
|
87
|
+
puts "====>>>>> codegigned is : #{codesigned}"
|
88
|
+
|
89
|
+
table = Terminal::Table.new do |t|
|
90
|
+
plist.each do |key, value|
|
91
|
+
next if key == "DeveloperCertificates"
|
92
|
+
|
93
|
+
columns = []
|
94
|
+
columns << key
|
95
|
+
columns << case value
|
96
|
+
when Hash
|
97
|
+
value.collect{|k, v| "#{k}: #{v}"}.join("\n")
|
98
|
+
when Array
|
99
|
+
value.join("\n")
|
100
|
+
else
|
101
|
+
value.to_s
|
102
|
+
end
|
103
|
+
|
104
|
+
t << columns
|
105
|
+
t << :separator
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
t << ["Codesigned", codesigned.to_s.capitalize]
|
110
|
+
end
|
111
|
+
|
112
|
+
puts table
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
# say "#{options.prefix}bar#{options.suffix}"
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
def determine_file!
|
124
|
+
files = Dir['*.ipa']
|
125
|
+
@file ||= case files.length
|
126
|
+
when 0 then nil
|
127
|
+
when 1 then files.first
|
128
|
+
else
|
129
|
+
@file = choose "Select an .ipa File:", *files
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gump Wang
|
@@ -95,11 +95,18 @@ dependencies:
|
|
95
95
|
description: Capor is command line tool for parser iOS .ipa file, you cat the ipa
|
96
96
|
package info like cat a file.
|
97
97
|
email: 1989wg@gmail.com
|
98
|
-
executables:
|
98
|
+
executables:
|
99
|
+
- capor
|
99
100
|
extensions: []
|
100
101
|
extra_rdoc_files: []
|
101
102
|
files:
|
103
|
+
- ".gitignore"
|
104
|
+
- README.md
|
105
|
+
- bin/capor
|
106
|
+
- capor.gemspec
|
102
107
|
- lib/capor.rb
|
108
|
+
- lib/capor/info.rb
|
109
|
+
- lib/capor/profile.rb
|
103
110
|
homepage: https://www.github.com/wanggang316/capor
|
104
111
|
licenses:
|
105
112
|
- MIT
|