pindo 4.6.9

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 (120) hide show
  1. checksums.yaml +7 -0
  2. data/bin/pindo +35 -0
  3. data/lib/pindo/base/aeshelper.rb +31 -0
  4. data/lib/pindo/base/deviceinfo.rb +90 -0
  5. data/lib/pindo/base/executable.rb +224 -0
  6. data/lib/pindo/base/githelper.rb +489 -0
  7. data/lib/pindo/base/hashhelper.rb +134 -0
  8. data/lib/pindo/base/plaininformative.rb +15 -0
  9. data/lib/pindo/base/plistbuddyexecutable.rb +121 -0
  10. data/lib/pindo/base/standarderror.rb +14 -0
  11. data/lib/pindo/client/applovinclient.rb +156 -0
  12. data/lib/pindo/client/aws3sclient.rb +183 -0
  13. data/lib/pindo/client/bossclient.rb +229 -0
  14. data/lib/pindo/client/bossconfigclient.rb +175 -0
  15. data/lib/pindo/client/giteeclient.rb +65 -0
  16. data/lib/pindo/client/httpclient.rb +40 -0
  17. data/lib/pindo/client/pgyerclient.rb +439 -0
  18. data/lib/pindo/client/tgateclient.rb +103 -0
  19. data/lib/pindo/command.rb +101 -0
  20. data/lib/pindo/config/pindoconfig.rb +439 -0
  21. data/lib/pindo/config/pindouserlocalconfig.rb +81 -0
  22. data/lib/pindo/deploy/Fastfile +233 -0
  23. data/lib/pindo/deploy/build.rb +167 -0
  24. data/lib/pindo/deploy/bundleid.rb +245 -0
  25. data/lib/pindo/deploy/cert.rb +508 -0
  26. data/lib/pindo/deploy/check.rb +79 -0
  27. data/lib/pindo/deploy/configproj.rb +89 -0
  28. data/lib/pindo/deploy/confusecode.rb +248 -0
  29. data/lib/pindo/deploy/confuseproj.rb +112 -0
  30. data/lib/pindo/deploy/fabric.rb +58 -0
  31. data/lib/pindo/deploy/getitcinfo.rb +248 -0
  32. data/lib/pindo/deploy/iap.rb +796 -0
  33. data/lib/pindo/deploy/initconfig.rb +128 -0
  34. data/lib/pindo/deploy/itcapp.rb +147 -0
  35. data/lib/pindo/deploy/itcinfo.rb +369 -0
  36. data/lib/pindo/deploy/pem.rb +55 -0
  37. data/lib/pindo/deploy/pullconfig.rb +46 -0
  38. data/lib/pindo/deploy/pushconfig.rb +83 -0
  39. data/lib/pindo/deploy/quswark.rb +146 -0
  40. data/lib/pindo/deploy/quswauth.rb +67 -0
  41. data/lib/pindo/deploy/reportbug.rb +135 -0
  42. data/lib/pindo/deploy/resign.rb +338 -0
  43. data/lib/pindo/deploy/tag.rb +108 -0
  44. data/lib/pindo/deploy/updateconfig.rb +129 -0
  45. data/lib/pindo/deploy/uploadipa.rb +63 -0
  46. data/lib/pindo/deploy.rb +44 -0
  47. data/lib/pindo/dev/autobuild.rb +204 -0
  48. data/lib/pindo/dev/autoresign.rb +186 -0
  49. data/lib/pindo/dev/confusecode.rb +127 -0
  50. data/lib/pindo/dev/confuseproj.rb +111 -0
  51. data/lib/pindo/dev/createbuild.rb +159 -0
  52. data/lib/pindo/dev/debug.rb +141 -0
  53. data/lib/pindo/dev/pub.rb +171 -0
  54. data/lib/pindo/dev/renewcert.rb +142 -0
  55. data/lib/pindo/dev.rb +23 -0
  56. data/lib/pindo/env/dreamstudio.rb +53 -0
  57. data/lib/pindo/env/flutter.rb +59 -0
  58. data/lib/pindo/env/flutter.sh +116 -0
  59. data/lib/pindo/env/quarkenv.rb +58 -0
  60. data/lib/pindo/env/swarkenv.rb +62 -0
  61. data/lib/pindo/env/workhard.rb +56 -0
  62. data/lib/pindo/env.rb +17 -0
  63. data/lib/pindo/ipa/autoresign.rb +188 -0
  64. data/lib/pindo/ipa/import.rb +261 -0
  65. data/lib/pindo/ipa/output.rb +396 -0
  66. data/lib/pindo/ipa.rb +22 -0
  67. data/lib/pindo/lib/forcepush.rb +159 -0
  68. data/lib/pindo/lib/lint.rb +115 -0
  69. data/lib/pindo/lib/push.rb +143 -0
  70. data/lib/pindo/lib/update.rb +75 -0
  71. data/lib/pindo/lib.rb +18 -0
  72. data/lib/pindo/module/appselect.rb +200 -0
  73. data/lib/pindo/module/appstore_in_app_purchase.rb +1803 -0
  74. data/lib/pindo/module/appstore_metadata_connect_api_helper.rb +12 -0
  75. data/lib/pindo/module/appstore_metadata_fastlane_helper.rb +922 -0
  76. data/lib/pindo/module/buildconfighelper.rb +13 -0
  77. data/lib/pindo/module/buildhelper.rb +76 -0
  78. data/lib/pindo/module/commonconfuseproj.rb +271 -0
  79. data/lib/pindo/module/config_project.sh +143 -0
  80. data/lib/pindo/module/configprojhelper.rb +631 -0
  81. data/lib/pindo/module/iap_tier.json +813 -0
  82. data/lib/pindo/module/icon_contents.json +116 -0
  83. data/lib/pindo/module/imessage_icon.json +91 -0
  84. data/lib/pindo/module/imgset_contents.json +21 -0
  85. data/lib/pindo/module/launchimg_contents.json +21 -0
  86. data/lib/pindo/module/pemcreate.rb +63 -0
  87. data/lib/pindo/module/pgyerhelper.rb +339 -0
  88. data/lib/pindo/module/xcodebuildpre.rb +258 -0
  89. data/lib/pindo/module/xcodehelper.rb +521 -0
  90. data/lib/pindo/options/appconfigoptions.rb +23 -0
  91. data/lib/pindo/options/deployoptions.rb +363 -0
  92. data/lib/pindo/pgyer/apptest.rb +104 -0
  93. data/lib/pindo/pgyer/comment.rb +95 -0
  94. data/lib/pindo/pgyer/download.rb +105 -0
  95. data/lib/pindo/pgyer/login.rb +61 -0
  96. data/lib/pindo/pgyer/upload.rb +234 -0
  97. data/lib/pindo/pgyer.rb +17 -0
  98. data/lib/pindo/repo/clone.rb +78 -0
  99. data/lib/pindo/repo/create.rb +55 -0
  100. data/lib/pindo/repo/login.rb +64 -0
  101. data/lib/pindo/repo/search.rb +60 -0
  102. data/lib/pindo/repo.rb +16 -0
  103. data/lib/pindo/setup.rb +60 -0
  104. data/lib/pindo/upgrade.rb +56 -0
  105. data/lib/pindo/utils/applovin.rb +213 -0
  106. data/lib/pindo/utils/boss.rb +209 -0
  107. data/lib/pindo/utils/clearcert.rb +60 -0
  108. data/lib/pindo/utils/device.rb +279 -0
  109. data/lib/pindo/utils/icon.rb +91 -0
  110. data/lib/pindo/utils/icon.sh +133 -0
  111. data/lib/pindo/utils/podindex.rb +56 -0
  112. data/lib/pindo/utils/podindex.sh +30 -0
  113. data/lib/pindo/utils/renewproj.rb +146 -0
  114. data/lib/pindo/utils/tgate.rb +159 -0
  115. data/lib/pindo/utils/xcassets.rb +46 -0
  116. data/lib/pindo/utils/xcassets.sh +88 -0
  117. data/lib/pindo/utils.rb +29 -0
  118. data/lib/pindo/version.rb +110 -0
  119. data/lib/pindo.rb +34 -0
  120. metadata +364 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 78cbf0c3494294a495f70d4d68732ab4d7fcb111efb47c13832bcc5570fdda49
4
+ data.tar.gz: 9b6072f6a35def3e42a09f36796bbe4a4999e2157d76225864ba3325a55d6d1c
5
+ SHA512:
6
+ metadata.gz: cb6837bd54cd72e830010a5d263437913af930b6c3e9ce1c15ee9450a0699fa58e74b3cc14de69f6979efd147b051536d4698e36eebecfa47c6b6d6c97f5f731
7
+ data.tar.gz: 44b8eefc1b54857a60f20a72026f790bf134110976b97415dee6419086336cd7f30472cccdc37b7dda501a878609a279d55dbd5f8c9ca21eb99cf47dc773eb8e
data/bin/pindo ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ if Encoding.default_external != Encoding::UTF_8
5
+
6
+ if ARGV.include? '--no-ansi'
7
+ STDERR.puts <<-DOC
8
+ WARNING: pindo requires your terminal to be using UTF-8 encoding.
9
+ Consider adding the following to ~/.profile:
10
+ export LANG=en_US.UTF-8
11
+ DOC
12
+ else
13
+ STDERR.puts <<-DOC
14
+ \e[33mWARNING: pindo requires your terminal to be using UTF-8 encoding.
15
+ Consider adding the following to ~/.profile:
16
+ export LANG=en_US.UTF-8
17
+ \e[0m
18
+ DOC
19
+ end
20
+ end
21
+
22
+ if $PROGRAM_NAME == __FILE__ && !ENV['PINDO_NO_BUNDLER']
23
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
24
+ require 'rubygems'
25
+ require 'bundler/setup'
26
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
27
+
28
+ elsif ENV['PINDO_NO_BUNDLER']
29
+ require 'rubygems'
30
+ gem 'pindo'
31
+ end
32
+
33
+ require 'pindo'
34
+
35
+ Pindo::PindoApp.new.run(ARGV)
@@ -0,0 +1,31 @@
1
+ module Pindo
2
+
3
+
4
+ module AESHelper
5
+
6
+
7
+
8
+
9
+ def self.aes_128_ecb_encrypt(key, encrypted_string)
10
+ cipher = OpenSSL::Cipher::Cipher.new('AES-128-ECB')
11
+ cipher.encrypt
12
+ cipher.key = key
13
+ txt = cipher.update(encrypted_string) << cipher.final
14
+ content = Base64.strict_encode64(txt)
15
+ return content
16
+ end
17
+
18
+ def self.aes_128_ecb_decrypt(key, decrypted_string)
19
+ cipher = OpenSSL::Cipher.new("AES-128-ECB")
20
+ cipher.decrypt
21
+ cipher.key = key
22
+ text = cipher.update(Base64.strict_decode64(decrypted_string)) + cipher.final
23
+ return text
24
+ end
25
+
26
+
27
+
28
+ end
29
+
30
+
31
+ end
@@ -0,0 +1,90 @@
1
+
2
+ module Pindo
3
+
4
+
5
+ class DeviceInfo
6
+
7
+ attr_accessor :timezone
8
+ attr_accessor :xcdev
9
+ attr_accessor :region_code
10
+ attr_accessor :language_code
11
+ attr_accessor :system_version
12
+ attr_accessor :network_type
13
+ attr_accessor :name
14
+ attr_accessor :machine
15
+
16
+
17
+ attr_accessor :device_id
18
+ attr_accessor :idfa
19
+ attr_accessor :idfv
20
+ attr_accessor :tzlid
21
+ attr_accessor :sutid
22
+ attr_accessor :sbsid
23
+
24
+ attr_accessor :carriers
25
+
26
+
27
+
28
+ def initialize(configfile:nil)
29
+
30
+ @timezone = 28800
31
+ @xcdev = false
32
+ @region_code = "US"
33
+ @language_code = "en"
34
+ @system_version = "16.4"
35
+ @network_type = "WIFI"
36
+ @name = "iPhone 14"
37
+ @machine = "x86_64"
38
+
39
+
40
+ @device_id = "PINDO000-0000-0000-0000-0000DEVICEID"
41
+ @idfa = "PINDO000-0000-0000-0000-00000000IDFA"
42
+ @sbsid = "PINDO000-0000-0000-0000-0000000SBSID"
43
+ @sutid = "PINDO000-0000-0000-0000-0000000SUTID"
44
+ @tzlid = "PINDO000-0000-0000-0000-0000000TZLID"
45
+ @idfv = "PINDO000-0000-0000-0000-00000000IDFV"
46
+
47
+ @carriers = []
48
+
49
+ if !configfile.nil? && File.exist?(configfile)
50
+
51
+ default_data = JSON.parse(File.read(configfile))
52
+ if !default_data.nil?
53
+
54
+ reset_with_config(device_config:default_data)
55
+
56
+ end
57
+
58
+ end
59
+
60
+
61
+ end
62
+
63
+ def reset_with_config(device_config:nil)
64
+
65
+
66
+ if !device_config.nil?
67
+
68
+ @timezone = device_config["timezone"] || 28800
69
+ @xcdev = device_config["xcdev"] || false
70
+ @region_code = device_config["region_code"] || "US"
71
+ @language_code = device_config["language_code"] || "en"
72
+ @system_version = device_config["system_version"] || "16.4"
73
+ @network_type = device_config["network_type"] || "WIFI"
74
+ @name = device_config["name"] || "iPhone 14"
75
+ @machine = device_config["machine"] || "x86_64"
76
+
77
+ @device_id = device_config["device_id"] || "PINDO000-0000-0000-0000-0000DEVICEID"
78
+ @idfa = device_config["idfa"] || "PINDO000-0000-0000-0000-00000000IDFA"
79
+ @sbsid = device_config["sbsid"] || "PINDO000-0000-0000-0000-0000000SBSID"
80
+ @sutid = device_config["sutid"] || "PINDO000-0000-0000-0000-0000000SUTID"
81
+ @tzlid = device_config["tzlid"] || "PINDO000-0000-0000-0000-0000000TZLID"
82
+ @idfv = device_config["idfv"] || "PINDO000-0000-0000-0000-00000000IDFV"
83
+
84
+ @carriers = device_config["carriers"] || []
85
+
86
+ end
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,224 @@
1
+ module Pindo
2
+ # Module which provides support for running executables.
3
+ #
4
+ # In a class it can be used as:
5
+ #
6
+ # extend Executable
7
+ # executable :git
8
+ #
9
+ # This will create two methods `git` and `git!` both accept a command but
10
+ # the later will raise on non successful executions. The methods return the
11
+ # output of the command.
12
+ #
13
+ module Executable
14
+ # Creates the methods for the executable with the given name.
15
+ #
16
+ # @param [Symbol] name
17
+ # the name of the executable.
18
+ #
19
+ # @return [void]
20
+ #
21
+ def executable(name)
22
+ define_method(name) do |*command|
23
+ Executable.execute_command(name, Array(command).flatten, false)
24
+ end
25
+
26
+ define_method(name.to_s + '!') do |*command|
27
+ Executable.execute_command(name, Array(command).flatten, true)
28
+ end
29
+ end
30
+
31
+ # Executes the given command displaying it if in verbose mode.
32
+ #
33
+ # @param [String] executable
34
+ # The binary to use.
35
+ #
36
+ # @param [Array<#to_s>] command
37
+ # The command to send to the binary.
38
+ #
39
+ # @param [Bool] raise_on_failure
40
+ # Whether it should raise if the command fails.
41
+ #
42
+ # @raise If the executable could not be located.
43
+ #
44
+ # @raise If the command fails and the `raise_on_failure` is set to true.
45
+ #
46
+ # @return [String] the output of the command (STDOUT and STDERR).
47
+ #
48
+ def self.execute_command(executable, command, raise_on_failure = true)
49
+ bin = which!(executable)
50
+
51
+ command = command.map(&:to_s)
52
+ full_command = "#{bin} #{command.join(' ')}"
53
+
54
+
55
+ # if Config.instance.verbose?
56
+ # puts "$ #{full_command}"
57
+ # stdout = Indenter.new(STDOUT)
58
+ # stderr = Indenter.new(STDERR)
59
+ # else
60
+ stdout = Indenter.new
61
+ stderr = Indenter.new
62
+ # end
63
+
64
+
65
+ status = popen3(bin, command, stdout, stderr)
66
+ stdout = stdout.join
67
+ stderr = stderr.join
68
+ output = stdout + stderr
69
+ unless status.success?
70
+ if raise_on_failure
71
+ raise Informative, "#{full_command}\n\n#{output}"
72
+ else
73
+ puts "[!] Failed: #{full_command}"
74
+ end
75
+ end
76
+
77
+ output
78
+ end
79
+
80
+ # Returns the absolute path to the binary with the given name on the current
81
+ # `PATH`, or `nil` if none is found.
82
+ #
83
+ # @param [String] program
84
+ # The name of the program being searched for.
85
+ #
86
+ # @return [String,Nil] The absolute path to the given program, or `nil` if
87
+ # it wasn't found in the current `PATH`.
88
+ #
89
+ def self.which(program)
90
+ program = program.to_s
91
+ paths = ENV.fetch('PATH') { '' }.split(File::PATH_SEPARATOR)
92
+ paths.unshift('./')
93
+ paths.uniq!
94
+ paths.each do |path|
95
+ bin = File.expand_path(program, path)
96
+ if File.file?(bin) && File.executable?(bin)
97
+ return bin
98
+ end
99
+ end
100
+ nil
101
+ end
102
+
103
+ # Returns the absolute path to the binary with the given name on the current
104
+ # `PATH`, or raises if none is found.
105
+ #
106
+ # @param [String] program
107
+ # The name of the program being searched for.
108
+ #
109
+ # @return [String] The absolute path to the given program.
110
+ #
111
+ def self.which!(program)
112
+ which(program).tap do |bin|
113
+ raise Informative, "Unable to locate the executable `#{program}`" unless bin
114
+ end
115
+ end
116
+
117
+ # Runs the given command, capturing the desired output.
118
+ #
119
+ # @param [String] bin
120
+ # The binary to use.
121
+ #
122
+ # @param [Array<#to_s>] command
123
+ # The command to send to the binary.
124
+ #
125
+ # @param [Symbol] capture
126
+ # Whether it should raise if the command fails.
127
+ #
128
+ # @raise If the executable could not be located.
129
+ #
130
+ # @return [(String, Process::Status)]
131
+ # The desired captured output from the command, and the status from
132
+ # running the command.
133
+ #
134
+ def self.capture_command(executable, command, capture: :merge)
135
+ bin = which!(executable)
136
+
137
+ require 'open3'
138
+ command = command.map(&:to_s)
139
+ case capture
140
+ when :merge then Open3.capture2e(bin, *command)
141
+ when :both then Open3.capture3(bin, *command)
142
+ when :out then Open3.capture3(bin, *command).values_at(0, -1)
143
+ when :err then Open3.capture3(bin, *command).drop(1)
144
+ when :none then Open3.capture3(bin, *command).last
145
+ end
146
+ end
147
+
148
+ private
149
+
150
+ def self.popen3(bin, command, stdout, stderr)
151
+ require 'open3'
152
+ Open3.popen3(bin, *command) do |i, o, e, t|
153
+ reader(o, stdout)
154
+ reader(e, stderr)
155
+ i.close
156
+
157
+ status = t.value
158
+
159
+ o.flush
160
+ e.flush
161
+ sleep(0.01)
162
+
163
+ status
164
+ end
165
+ end
166
+
167
+ def self.reader(input, output)
168
+ Thread.new do
169
+ buf = ''
170
+ begin
171
+ loop do
172
+ buf << input.readpartial(4096)
173
+ loop do
174
+ string, separator, buf = buf.partition(/[\r\n]/)
175
+ if separator.empty?
176
+ buf = string
177
+ break
178
+ end
179
+ output << (string << separator)
180
+ end
181
+ end
182
+ rescue EOFError
183
+ output << (buf << $/) unless buf.empty?
184
+ end
185
+ end
186
+ end
187
+
188
+ #-------------------------------------------------------------------------#
189
+
190
+ # Helper class that allows to write to an {IO} instance taking into account
191
+ # the UI indentation level.
192
+ #
193
+ class Indenter < ::Array
194
+ # @return [Fixnum] The indentation level of the UI.
195
+ #
196
+ attr_reader :indent
197
+
198
+ # @return [IO] the {IO} to which the output should be printed.
199
+ #
200
+ attr_reader :io
201
+
202
+ # Init a new Indenter
203
+ #
204
+ # @param [IO] io @see io
205
+ #
206
+ def initialize(io = nil)
207
+ @io = io
208
+ @indent = ' '
209
+ end
210
+
211
+ # Stores a portion of the output and prints it to the {IO} instance.
212
+ #
213
+ # @param [String] value
214
+ # the output to print.
215
+ #
216
+ # @return [void]
217
+ #
218
+ def <<(value)
219
+ super
220
+ io << "#{indent}#{value}" if io
221
+ end
222
+ end
223
+ end
224
+ end