veracode 1.0.0.alpha

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.
data/bin/veracode ADDED
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env ruby
2
+ require 'optparse'
3
+
4
+ $:.unshift File.expand_path(File.dirname(__FILE__) + "/../lib")
5
+ $:.unshift Dir.pwd
6
+
7
+ unless File.exists?("script/rails")
8
+ $stderr.puts "Current directory #{File.basename(Dir.pwd).dump} does not appear to be a Rails 3 application."
9
+ exit
10
+ end
11
+ APP_PATH = File.expand_path('config/application')
12
+ APP_NAME = File.basename(Dir.pwd)
13
+ COMMAND = "#{$0} #{ARGV.join(' ')}"
14
+
15
+ require 'veracode'
16
+
17
+ $options = {
18
+ :phase1 => false,
19
+ :phase2 => false,
20
+ :phase3 => true,
21
+ :archive_source => true,
22
+ :include_inherited => false,
23
+ :jruby => false,
24
+ }
25
+
26
+ subcommand = ARGV.shift
27
+ case subcommand
28
+ when "prepare", "prep"
29
+ OptionParser.new do |opts|
30
+ opts.banner = "Usage: veracode prepare [options]"
31
+
32
+ opts.on("-v", "--verbose", "Run verbosely") do
33
+ $options[:verbose] = true
34
+ end
35
+
36
+ opts.on("-a", "--all", "Archive objects at all stages") do
37
+ $options[:phase1] = true
38
+ $options[:phase2] = true
39
+ end
40
+
41
+ opts.on("-f", "--file", "Disassemble .rb files") do
42
+ $options[:disasm] = true
43
+ end
44
+
45
+ opts.on("-j", "--jruby", "Force JRuby mode") do
46
+ $options[:jruby] = true
47
+ end
48
+
49
+ opts.on("--[no-]source", "[Don't] Include source code in archive") do |s|
50
+ $options[:archive_source] = s
51
+ end
52
+
53
+ opts.on("-D", "--debug", "Enable debug output") do
54
+ $DEBUG = true
55
+ end
56
+
57
+ end.parse!
58
+
59
+ Veracode.prepare
60
+
61
+ when "help", nil
62
+ ARGV.clear
63
+ ARGV.unshift "--help"
64
+
65
+ OptionParser.new do |opts|
66
+ opts.banner = "Usage: veracode prepare [options]"
67
+ end.parse!
68
+
69
+ else
70
+ $stderr.puts "#{subcommand.dump} is not a valid subcommand"
71
+
72
+ ARGV.clear
73
+ ARGV.unshift "--help"
74
+
75
+ OptionParser.new do |opts|
76
+ opts.banner = "Usage: veracode prepare [options]"
77
+ end.parse!
78
+
79
+ end
80
+
81
+
data/lib/veracode.rb ADDED
@@ -0,0 +1,739 @@
1
+ require 'zlib'
2
+ require 'zip/zip'
3
+ require "veracode/version"
4
+
5
+ module Veracode
6
+ @run_id = nil
7
+
8
+ # Metadata and method disassemblies for all Modules (.txt.gz)
9
+ @disasmlog = nil
10
+ @disasmlog_filename = "disasm.txt.gz"
11
+
12
+ # Error log including capture of STDERR and any errors generated by the gem (.log)
13
+ @errorlog = nil
14
+ @errorlog_filename = "error.log"
15
+
16
+ # Index file containing the names of files present in the application directory (.txt)
17
+ @index_filename = "index.txt"
18
+
19
+ # Manifest file containing original names of all files in archive (.txt)
20
+ @manifest = []
21
+ @manifest_filename = "manifest.txt"
22
+
23
+ # The final archive that will be uploaded to Veracode for analysis (.zip)
24
+ @archive = nil
25
+ @archive_filename = nil
26
+ @archive_dirname = nil
27
+
28
+
29
+ def self.init
30
+ @run_id = Time.now.strftime("%Y%m%d%H%M%S")
31
+ @archive_dirname = File.join("tmp","veracode-#{@run_id}")
32
+
33
+ if !Dir.exists?("tmp")
34
+ begin
35
+ Dir.mkdir("tmp")
36
+ rescue Exception => e
37
+ $stderr.puts "Directory 'tmp' does not exist and cannot be created: #{e.message}"
38
+ exit
39
+ end
40
+ end
41
+
42
+ while Dir.exists?(@archive_dirname)
43
+ @run_id = Time.now.strftime("%Y%m%d%H%M%S")
44
+ @archive_dirname = File.join("tmp","veracode-#{@run_id}")
45
+ end
46
+
47
+ begin
48
+ Dir.mkdir(@archive_dirname)
49
+ rescue Exception => e
50
+ $stderr.puts "Unable to make directory #{@archive_dirname}: #{e.message}"
51
+ exit
52
+ end
53
+
54
+ @archive_filename = File.join("tmp","veracode-#{APP_NAME}-#{@run_id}.zip")
55
+
56
+ @errorlog_filename = File.join(@archive_dirname, @errorlog_filename)
57
+ @disasmlog_filename = File.join(@archive_dirname, @disasmlog_filename)
58
+ @index_filename = File.join(@archive_dirname, @index_filename)
59
+ @manifest_filename = File.join(@archive_dirname, @manifest_filename)
60
+
61
+ # Try touching each of the files to be written
62
+ [@disasmlog_filename, @errorlog_filename, @index_filename, @manifest_filename].each {|f|
63
+ begin
64
+ File.open(f, "wb") {}
65
+ rescue Exception => e
66
+ $stderr.puts "Unable to create file #{f}: #{e.message}"
67
+ exit
68
+ else
69
+ @manifest << f
70
+ end
71
+ }
72
+
73
+ begin
74
+ @errorlog = File.open(@errorlog_filename, "wb")
75
+ log_error "COMMAND: #{COMMAND}"
76
+ log_error "RUBY_DESCRIPTION: #{RUBY_DESCRIPTION}"
77
+ log_error "RAILS_VERSION: " + `rails --version`.chomp
78
+ log_error "GEM_VERSION: #{Veracode::VERSION}"
79
+ log_error "PWD: #{Dir.pwd.to_s.dump}"
80
+ log_error "APP_NAME: #{APP_NAME.dump}"
81
+ log_error "RUNID: #{@run_id}"
82
+ rescue Exception => e
83
+ $stderr.puts "Unable to create errorlog #{@errorlog_filename}: #{e.message}"
84
+ @errorlog = $stderr
85
+ else
86
+ STDERR.reopen(@errorlog)
87
+ end
88
+
89
+ index_application
90
+
91
+ @manifest += Dir.glob("*").keep_if {|f| File.file?(f)}
92
+
93
+ # {app config db doc lib log public script test tmp vendor}
94
+ %w{app config lib log public script vendor}.each {|dirname|
95
+ @manifest += Dir[File.join(dirname, "**", "*")].keep_if {|f| File.file?(f)}
96
+ }
97
+ @manifest += Dir[File.join("db", "**", "*.rb")]
98
+
99
+ if $options[:archive_source]
100
+ # Add any other ruby files not already added
101
+ @manifest |= Dir[File.join("**","*.rb")]
102
+ # Add any other erb files not already added
103
+ @manifest |= Dir[File.join("**","*.erb")]
104
+ # Add any other haml files not already added
105
+ @manifest |= Dir[File.join("**","*.haml")]
106
+ end
107
+
108
+ end
109
+
110
+ def self.index_application
111
+ File.open(@index_filename, "wb") {|index_file|
112
+ Dir[File.join("**","*")].keep_if {|f| File.file?(f)}.sort.each {|f|
113
+ index_file.puts f.dump
114
+ }
115
+ }
116
+ end
117
+
118
+ def self.pack_manifest
119
+
120
+ puts "Archiving disassembly and source files"
121
+
122
+ begin
123
+ File.open(@manifest_filename, "wb") { |mf|
124
+ @manifest.sort.each { |f|
125
+ mf.puts f.to_s.dump
126
+ }
127
+ }
128
+ rescue Exception => e
129
+ log_error e.message
130
+ $stderr.puts "Unable to write manifest file #{@manifest_filename}: #{e.message}"
131
+ end
132
+
133
+ @errorlog.flush
134
+
135
+ begin
136
+ Zip::ZipFile.open(@archive_filename, Zip::ZipFile::CREATE) { |zf|
137
+ @manifest.each {|file|
138
+
139
+ if file.start_with?(@archive_dirname)
140
+ name_in_archive = file.sub(/^#{@archive_dirname + File::SEPARATOR}/,"")
141
+ else
142
+ name_in_archive = File.join(APP_NAME, file)
143
+ end
144
+
145
+ puts "Adding #{file} to archive as #{name_in_archive}" if $options[:verbose]
146
+ zf.add(name_in_archive, file)
147
+ }
148
+ }
149
+ rescue Exception => e
150
+ $stderr.puts "Unable to create archive #{@manifest_filename}: #{e.message}"
151
+ exit
152
+ end
153
+
154
+ puts "Please upload #{@archive_filename}"
155
+ end
156
+
157
+ def self.cleanup
158
+ [@disasmlog_filename, @errorlog_filename, @index_filename, @manifest_filename].each {|f|
159
+ begin
160
+ File.delete(f)
161
+ rescue Exception => e
162
+ log_error "Unable to delete #{f.to_s.dump} (#{e.message})"
163
+ end
164
+ }
165
+
166
+ begin
167
+ Dir.delete(@archive_dirname)
168
+ rescue Exception => e
169
+ puts "Unable to remove #{@archive_dirname.to_s.dump} (#{e.message})"
170
+ log_error "Unable to remove #{@archive_dirname.to_s.dump} (#{e.message})"
171
+ end
172
+ end
173
+
174
+ def self.baseline
175
+ self.update
176
+ @baseline_objects = @objects
177
+ @baseline_modules = @modules
178
+ @baseline_classes = @classes
179
+ end
180
+
181
+ def self.rebaseline
182
+ self.baseline
183
+ end
184
+
185
+ def self.update
186
+ @objects = ObjectSpace.each_object.to_a
187
+ @modules = ObjectSpace.each_object(Module).to_a
188
+ @classes = ObjectSpace.each_object(Class).to_a
189
+ end
190
+
191
+ def self.stats
192
+ puts "#{ObjectSpace.each_object.count.to_s} objects"
193
+ puts "#{ObjectSpace.each_object(Module).count.to_s} modules"
194
+ puts "#{ObjectSpace.each_object(Class).count.to_s} classes"
195
+ puts
196
+ end
197
+
198
+
199
+ ##############################################################################
200
+ # Helpers
201
+ def self.glob_require(files)
202
+ Dir.glob(files) do |f|
203
+ print "Requiring #{f.to_s} " if $options[:verbose]
204
+
205
+ begin
206
+ require File.expand_path(f)
207
+ rescue Exception => e
208
+ puts "(failed: #{e.message})" if $options[:verbose]
209
+ log_error "Unable to require #{File.expand_path(f).to_s.dump} (#{e.message})"
210
+ else
211
+ puts "(OK)" if $options[:verbose]
212
+ end
213
+
214
+ end
215
+ end
216
+
217
+ def self.safe_name(o)
218
+ case
219
+ when o == ActiveSupport::TimeWithZone
220
+ "ActiveSupport::TimeWithZone"
221
+ when o.is_a?(Module)
222
+ ( o.name.nil? ? o.to_s : o.name )
223
+ when o.is_a?(Method), o.is_a?(UnboundMethod)
224
+ o.name.to_s
225
+ else
226
+ o.to_s
227
+ end
228
+ end
229
+
230
+ def self.quote(o)
231
+ o.to_s.dump
232
+ end
233
+
234
+ def self.quote_if_string(o)
235
+ ( o.is_a?(String) ? o.dump : o.inspect )
236
+ end
237
+
238
+ def self.good_type?(o)
239
+ %w{
240
+ Array
241
+ Bignum
242
+ Class
243
+ FalseClass
244
+ Fixnum
245
+ Float
246
+ Hash
247
+ Module
248
+ NilClass
249
+ Range
250
+ Rational
251
+ Regexp
252
+ String
253
+ Symbol
254
+ Time
255
+ TrueClass
256
+ }.include?(o.class.to_s)
257
+ end
258
+
259
+ def self.safe_inspect(o)
260
+ if o.is_a?(Array)
261
+ "[" +
262
+ o.map {|i| safe_inspect(i) }.join(", ") +
263
+ "]"
264
+ elsif o.is_a?(Hash)
265
+ "{" +
266
+ o.map {|k,v| "#{safe_inspect(k)}=>#{safe_inspect(v)}" }.join(", ") +
267
+ "}"
268
+ elsif o.is_a?(Module)
269
+ safe_name(o)
270
+ elsif good_type?(o)
271
+ quote_if_string(o)
272
+ else
273
+ ":veracode_nil" # not a white-listed type
274
+ end
275
+ end
276
+
277
+ def self.log_error(data)
278
+ @errorlog.printf "veracode [%s] %s\n", Time.now.to_s, data.to_s.chomp
279
+ end
280
+
281
+
282
+ ##############################################################################
283
+ # Archiving
284
+ def self.prepare_archive
285
+ @disasmlog = Zlib::GzipWriter.new(File.open(@disasmlog_filename, "wb"), nil, nil)
286
+ @disasmlog.puts "#{RUBY_ENGINE}-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
287
+ @disasmlog.puts "# " + `rails --version`.chomp
288
+ @disasmlog.puts
289
+ end
290
+
291
+ def self.finalize_archive
292
+ @disasmlog.close unless @disasmlog.nil?
293
+ end
294
+
295
+ def self.add_to_archive(data)
296
+ if @disasmlog.nil?
297
+ prepare_archive
298
+ end
299
+ @disasmlog.write(data)
300
+ end
301
+
302
+
303
+ def self.format_method(m, kind, with_disasm=true)
304
+ return "" unless ((m.is_a? Method ) || (m.is_a? UnboundMethod))
305
+
306
+ puts " #{kind}_method #{quote(safe_name(m))}" if $options[:verbose]
307
+
308
+ formatted = "#{kind}_method #{quote(safe_name(m))} #{m.parameters.to_s}\n"
309
+
310
+ if with_disasm
311
+ insns = RubyVM::InstructionSequence.disassemble(m)
312
+ formatted += ( (insns.nil? || insns.empty?) ?
313
+ "== disasm\n== end disasm\n" :
314
+ "#{insns}== end disasm\n"
315
+ )
316
+ end
317
+
318
+ formatted
319
+ end
320
+
321
+ def self.format_variable(v_symbol, v, kind)
322
+ puts " #{quote(kind)} variable #{quote(v_symbol)}" if $options[:verbose]
323
+
324
+ "#{kind}_variable %s %s%s\n" %
325
+ [quote(v.class), quote(v_symbol), ( good_type?(v) ? " = #{safe_inspect(v)}" : "")]
326
+ end
327
+
328
+ def self.format_constant(c_symbol, c)
329
+ puts " constant #{quote(c_symbol)}" if $options[:verbose]
330
+
331
+ "constant %s %s%s\n" %
332
+ [quote(c.class), quote(c_symbol), ( good_type?(c) ? " = #{safe_inspect(c)}" : "")]
333
+ end
334
+
335
+
336
+ ##############################################################################
337
+ # Archiving Headers
338
+ def self.class_header(c)
339
+ return "" unless c.is_a? Class
340
+
341
+ puts " class header" if $options[:verbose]
342
+
343
+ case
344
+ when c.superclass.nil? # this should only happen for BasicObject
345
+ return ""
346
+ when c.superclass.name.nil? # in case the parent is anonymous
347
+ name = c.superclass.to_s.dump
348
+ else
349
+ name = c.superclass.name.dump
350
+ end
351
+
352
+ "superclass #{name}\n"
353
+ end
354
+
355
+ def self.module_header(m)
356
+ return "" unless m.is_a? Module
357
+
358
+ puts " module header" if $options[:verbose]
359
+
360
+ ( m.included_modules.count > 0 ?
361
+ m.included_modules.map {|m| "include #{m.inspect.dump}\n" }.join :
362
+ ""
363
+ ) +
364
+ ( m.singleton_class.included_modules.count > 0 ?
365
+ m.singleton_class.included_modules.map {|m| "extend #{m.inspect.dump}\n" }.join :
366
+ ""
367
+ )
368
+ end
369
+
370
+
371
+ ##############################################################################
372
+ # Archiving Contents
373
+ def self.module_contents(m, with_disasm=true)
374
+ return "" unless m.is_a? Module
375
+
376
+ puts " module contents" if $options[:verbose]
377
+
378
+ formatted_contents = ""
379
+
380
+ m.constants($options[:include_inherited]).each do |c_symbol|
381
+ begin
382
+ c = m.const_get(c_symbol) if m.const_defined? c_symbol
383
+ formatted_contents += format_constant(c_symbol, c)
384
+ rescue Exception => e
385
+ log_error "Error archiving constant #{c_symbol.to_s.dump}: #{e.message}"
386
+ formatted_contents += format_constant(c_symbol, :veracode_nil)
387
+ end
388
+ end
389
+
390
+ m.class_variables.each do |v_symbol|
391
+ begin
392
+ v = m.class_variable_get(v_symbol)
393
+ formatted_contents += format_variable(v_symbol, v, "class")
394
+ rescue Exception => e
395
+ log_error "Error archiving class variable #{v_symbol.to_s.dump}: #{e.message}"
396
+ formatted_contents += format_variable(v_symbol, :veracode_nil, "class")
397
+ end
398
+ end
399
+
400
+ if m.respond_to?(:global_variables)
401
+ m.global_variables.each do |v_symbol|
402
+ begin
403
+ v = eval(v_symbol.to_s)
404
+ formatted_contents += format_variable(v_symbol, v, "global")
405
+ rescue Exception => e
406
+ log_error "Error archiving global variable #{v_symbol.to_s.dump}: #{e.message}"
407
+ formatted_contents += format_variable(v_symbol, :veracode_nil, "global")
408
+ end
409
+
410
+ end
411
+ end
412
+
413
+ %w[ public protected private ].each {|p|
414
+ get_methods = (p + "_instance_methods").to_sym
415
+ if m.respond_to?(get_methods) && m.send(get_methods, $options[:include_inherited]).count > 0
416
+ m.send(get_methods, $options[:include_inherited]).each do |m_symbol|
417
+ begin
418
+ method = m.instance_method(m_symbol)
419
+ formatted_contents += format_method(method, "#{p.to_s}_instance", with_disasm)
420
+ rescue Exception => e
421
+ log_error "Error archiving #{p.to_s} instance method #{m_symbol.to_s.dump}: #{e.message}"
422
+ end
423
+ end
424
+ end
425
+ }
426
+
427
+ formatted_contents
428
+ end
429
+
430
+ def self.object_contents(o, with_disasm=true)
431
+ return "" unless o.is_a? Object
432
+
433
+ puts " object contents" if $options[:verbose]
434
+
435
+ formatted_contents = ""
436
+
437
+ if o.respond_to?(:instance_variables) && o.instance_variables.count > 0
438
+ o.instance_variables.each do |v_symbol|
439
+ begin
440
+ v = o.instance_variable_get(v_symbol)
441
+ formatted_contents += format_variable(v_symbol, v, "instance")
442
+ rescue Exception => e
443
+ log_error "Error archiving instance variable #{v_symbol.to_s.dump}: #{e.message}"
444
+ formatted_contents += format_variable(v_symbol, :veracode_nil, "instance")
445
+ end
446
+ end
447
+ end
448
+
449
+ if o.respond_to?(:singleton_methods) && o.singleton_methods($options[:include_inherited]).count > 0
450
+ o.singleton_methods($options[:include_inherited]).each do |m_symbol|
451
+ begin
452
+ m = o.method(m_symbol)
453
+ formatted_contents += format_method(m, "singleton", with_disasm)
454
+ rescue Exception => e
455
+ log_error "Error archiving singleton method #{m_symbol.to_s.dump}: #{e.message}"
456
+ end
457
+ end
458
+ end
459
+
460
+ formatted_contents
461
+ end
462
+
463
+
464
+ ##############################################################################
465
+ # Archiving Objects
466
+ def self.archive(objects, with_disasm=true)
467
+
468
+ objects = objects - [Veracode]
469
+
470
+ if $options[:verbose]
471
+ puts "Archiving #{objects.count.to_s} objects" + (with_disasm ? " with disassembly" : "")
472
+ puts
473
+ end
474
+
475
+ objects.sort_by {|o| safe_name(o) }.each do |o|
476
+
477
+ puts "archiving #{o.class.to_s.downcase} #{quote(safe_name(o))}" if $options[:verbose]
478
+
479
+ add_to_archive "#{o.class.to_s.downcase} #{quote(safe_name(o))}\n" +
480
+
481
+ ( o.is_a?(Class) ? class_header(o) : "") + # superclass
482
+ ( o.is_a?(Module) ? module_header(o) : "") + # included modules
483
+
484
+ ( o.is_a?(Object) ? object_contents(o, with_disasm) : "") +
485
+ ( o.is_a?(Module) ? module_contents(o, with_disasm) : "") +
486
+
487
+ "end#{o.class.to_s.downcase}\n" +
488
+ "\n"
489
+ end
490
+
491
+ end
492
+
493
+
494
+ def self.compile_erb_templates
495
+
496
+ # Rails 3 has wrapped Erubis to handle block helpers in ERB templates
497
+ # a little differently, e.g.:
498
+ # <%= form_for ... do %>
499
+ # vs the normal ERB:
500
+ # <% form_for ... do %>
501
+ #
502
+ # This means if Rails 3 erb templates are compiled with ERB or Erubis
503
+ # the resulting ruby source code will contain syntax errors.
504
+ # To avoid this, use the ActionView templates and handlers
505
+
506
+ view_paths = []
507
+ view_paths += ActionController::Base.view_paths.to_a.map(&:to_s)
508
+ view_paths |= [File.expand_path("app/views")]
509
+
510
+ puts "Looking for erb templates in #{view_paths.join(", ")}" if $options[:verbose]
511
+
512
+ templates = view_paths.map { |vp|
513
+ Dir[File.join(vp, "**", "*.erb")]
514
+ }.flatten
515
+
516
+ return unless templates.count > 0
517
+
518
+ puts "Found #{templates.count} erb templates" if $options[:verbose]
519
+
520
+ templates.each {|template|
521
+
522
+ puts "Compiling template #{template}" if $options[:verbose]
523
+
524
+ begin
525
+
526
+ t = ActionView::Template.new(
527
+ File.read(template),
528
+ template,
529
+ ActionView::Template::Handlers::ERB,
530
+ :virtual_path => template
531
+ )
532
+
533
+ case t.method(:compile).arity
534
+ when 2 # Rails 3.1.0+
535
+ t.send(:compile, ActionView::Base.new, ActionView::CompiledTemplates)
536
+ when 3
537
+ t.send(:compile, {}, ActionView::Base.new, ActionView::CompiledTemplates)
538
+ end
539
+
540
+ rescue Exception => e
541
+ puts "Unable to compile template #{template}"
542
+ log_error "Unable to compile template #{template} (#{e.message})"
543
+ end
544
+
545
+ }
546
+
547
+ puts "Compiled templates: " + ActionView::CompiledTemplates.instance_methods.count.to_s if $options[:verbose]
548
+
549
+ end
550
+
551
+ def self.compile_haml_templates
552
+
553
+ view_paths = []
554
+ view_paths += ActionController::Base.view_paths.to_a.map(&:to_s)
555
+ view_paths |= [File.expand_path("app/views")]
556
+
557
+ puts "Looking for haml templates in #{view_paths.join(", ")}" if $options[:verbose]
558
+
559
+ templates = view_paths.map {|vp|
560
+ Dir[File.join(vp, "**", "*.haml")]
561
+ }.flatten
562
+
563
+ return unless templates.count > 0
564
+
565
+ begin
566
+ require 'action_view'
567
+ require 'haml'
568
+ require 'haml/template/plugin'
569
+ rescue Exception => e
570
+ log_error "Unable to satisfy haml dependencies (#{e.message})"
571
+ return
572
+ end
573
+
574
+ puts "Found #{templates.count} haml templates" if $options[:verbose]
575
+
576
+ templates.each {|template|
577
+
578
+ puts "Compiling template #{template}" if $options[:verbose]
579
+
580
+ begin
581
+
582
+ t = ActionView::Template.new(
583
+ File.read(template),
584
+ template,
585
+ Haml::Plugin,
586
+ :virtual_path => template
587
+ )
588
+
589
+ case t.method(:compile).arity
590
+ when 2 # Rails 3.1.0+
591
+ t.send(:compile, ActionView::Base.new, ActionView::CompiledTemplates)
592
+ when 3
593
+ t.send(:compile, {}, ActionView::Base.new, ActionView::CompiledTemplates)
594
+ end
595
+
596
+ rescue Exception => e
597
+ puts "Unable to compile template #{template}"
598
+ log_error "Unable to compile template #{template} (#{e.message})"
599
+ end
600
+
601
+ }
602
+
603
+ puts "Compiled templates: " + ActionView::CompiledTemplates.instance_methods.count.to_s if $options[:verbose]
604
+
605
+ end
606
+
607
+
608
+
609
+
610
+ ################################################################################
611
+ # Subcommands
612
+ def self.prepare
613
+
614
+ init
615
+
616
+ puts "Preparing Ruby on Rails application #{APP_NAME.dump} for Veracode upload"
617
+ puts "Source code will be included in the archive" if $options[:archive_source]
618
+
619
+ if $options[:verbose]
620
+ puts Dir.pwd.to_s.dump
621
+ puts
622
+ end
623
+
624
+ if $options[:disasm]
625
+ rbfiles = File.join("**", "*.rb")
626
+ Dir[rbfiles].each do |f|
627
+ puts RubyVM::InstructionSequence.compile_file(f).disasm
628
+ puts
629
+ end
630
+ exit
631
+ end
632
+
633
+ prepare_archive
634
+
635
+ ################################################################
636
+ ## phase 1 - Create baseline
637
+ self.baseline
638
+
639
+ puts "Phase 1 - Initial State" if $options[:verbose]
640
+ self.stats if $options[:verbose]
641
+
642
+ if $options[:phase1]
643
+ puts "Processing and disassembling Ruby standard classes and modules"
644
+ archive(@modules)
645
+ end
646
+ ## /phase 1 - Create baseline
647
+ ################################################################
648
+
649
+
650
+
651
+ ################################################################
652
+ ## phase 2 - Require rails
653
+
654
+ puts "Phase 2 - Load Rails" if $options[:verbose]
655
+ begin
656
+ require "rails"
657
+ rescue Exception => e
658
+ puts "Unable to require rails: #{e.message}"
659
+ log_error "Unable to require rails: #{e.message}"
660
+ exit
661
+ else
662
+ puts "Required rails" if $options[:verbose]
663
+ end
664
+
665
+ self.update
666
+
667
+ self.stats if $options[:verbose]
668
+
669
+ if $options[:phase2]
670
+ puts "Processing and disassembling Rails classes and modules"
671
+ archive(@modules)
672
+ end
673
+
674
+ self.rebaseline
675
+ ## /phase 2 - Require rails
676
+ ################################################################
677
+
678
+
679
+
680
+ ################################################################
681
+ # phase 3 - require app
682
+
683
+ puts "Phase 3 - Imitate Rails" if $options[:verbose]
684
+
685
+ ## Imitate script/rails
686
+ # APP_PATH = File.expand_path('config/application')
687
+ # APP_PATH is already set in bin/veracode
688
+ #require File.expand_path('../../config/boot', __FILE__)
689
+ glob_require "config/boot.rb"
690
+ #require 'rails/commands'
691
+ # this will trigger the console to be launched
692
+ # ARGV.clear
693
+ # ARGV << 'console'
694
+ # ARGV << '--sandbox'
695
+ # require 'rails/commands'
696
+
697
+ ## Imitate rails/commands when console
698
+ glob_require 'rails/commands/console'
699
+ # require APP_PATH # => config/application.rb
700
+
701
+ glob_require "config/application.rb"
702
+
703
+ Rails.application.require_environment! unless $options[:jruby]
704
+ # Following line will actually kick off IRB
705
+ # Rails::Console.start(Rails.application)
706
+
707
+ # Imitate Rails::Console.initialize_console
708
+ # require "pp"
709
+ glob_require "rails/console/app"
710
+ glob_require "rails/console/helpers"
711
+
712
+ glob_require "app/models/**/*.rb"
713
+ glob_require "app/helpers/**/*.rb"
714
+ glob_require "app/controllers/application_controller.rb"
715
+ glob_require "app/controllers/**/*.rb"
716
+
717
+ compile_erb_templates
718
+ compile_haml_templates
719
+
720
+ self.update
721
+ self.stats if $options[:verbose]
722
+
723
+ if $options[:phase3]
724
+ puts "Processing and disassembling #{APP_NAME} classes and modules"
725
+ archive(@baseline_modules, false)
726
+ archive(@modules - @baseline_modules, true)
727
+ end
728
+
729
+ ## /phase 3 - require app
730
+ ################################################################
731
+
732
+ finalize_archive
733
+
734
+ pack_manifest
735
+ cleanup
736
+
737
+ end # self.prepare
738
+
739
+ end
@@ -0,0 +1,3 @@
1
+ module Veracode
2
+ VERSION = "1.0.0.alpha"
3
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: veracode
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.alpha
5
+ prerelease: 6
6
+ platform: ruby
7
+ authors:
8
+ - Veracode
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rubyzip
16
+ requirement: &70257511683960 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70257511683960
25
+ description: Prepares your Ruby on Rails app for submission to Veracode.
26
+ email: devcontact@veracode.com
27
+ executables:
28
+ - veracode
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - bin/veracode
33
+ - lib/veracode.rb
34
+ - lib/veracode/version.rb
35
+ homepage: http://veracode.com/
36
+ licenses: []
37
+ post_install_message:
38
+ rdoc_options: []
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 1.9.3.0
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>'
51
+ - !ruby/object:Gem::Version
52
+ version: 1.3.1
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 1.8.10
56
+ signing_key:
57
+ specification_version: 3
58
+ summary: Command line tool for preparing your Ruby on Rails app for submission to
59
+ Veracode
60
+ test_files: []