jsshuffle 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,4 +1,58 @@
1
- jsshuffle
2
- =========
1
+ jsshuffle ![Gem Version](https://badge.fury.io/rb/jsshuffle.svg)
2
+ ================================================================
3
3
 
4
4
  A library to just-in-time randomly obfuscate JS.
5
+
6
+
7
+ Installation
8
+ ------------
9
+
10
+ $ gem install jsshuffle
11
+
12
+ and
13
+
14
+ require 'jsshuffle'
15
+
16
+ should be enough to get you up and running.
17
+
18
+ For rails, just add _jsshuffle_ to your Gemfile:
19
+
20
+ gem 'jsshuffle', group: :production
21
+
22
+
23
+ Usage
24
+ -----
25
+
26
+ _jsshuffle_ can be used standalone and as a Ruby library.
27
+
28
+ The standalone executable takes a filename as a parameter or reads the input from `STDIN` and outputs on `STDOUT`:
29
+
30
+ $ jsshuffle <<EOF
31
+ > var test = 13;
32
+ > test = (test + 13) * 7;
33
+ > alert( test );
34
+ > EOF
35
+ var dqkwxnvj = 13;
36
+ dqkwxnvj = (dqkwxnvj + 13) * 7;
37
+ alert(dqkwxnvj);
38
+
39
+ To use _jsshuffle_ in your own Ruby project, instantiate `JsShuffle::Shuffler`:
40
+
41
+ require 'jsshuffle'
42
+
43
+ shuffler = JsShuffle::Shuffler.new use: :variable_renaming
44
+
45
+ puts shuffler.shuffle js: %Q(
46
+ var variable = "variable";
47
+ function newFunc( parameter ) {
48
+ return parameter + " is a cool parameter.";
49
+ }
50
+
51
+ console.log( newFunc( variable ) );
52
+ )
53
+
54
+ Extending JsShuffle
55
+ -------------------
56
+
57
+ You can sublcass `JsShuffle::Methods::Method` and pass the new class as a `use:` argument to `Shuffler#new` or alternatively pass a Block or Proc.
58
+ For more information view the RDoc.
data/Rakefile CHANGED
@@ -1,2 +1,7 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
2
3
 
4
+ desc "Run Tests"
5
+ Rake::TestTask.new do |t|
6
+ t.libs << 'test'
7
+ end
data/jsshuffle.gemspec CHANGED
@@ -17,8 +17,9 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_development_dependency "bundler", "~> 1.6"
21
- spec.add_development_dependency "rake", "~> 10.0"
20
+ spec.add_dependency "bundler", "~> 1.6"
21
+ spec.add_dependency "rake", "~> 10.0"
22
+ spec.add_dependency "rkelly-remix", "~> 0.0.6"
22
23
 
23
- spec.add_runtime_dependency "rkelly-remix", "~> 0.0.6"
24
+ spec.add_development_dependency "execjs", "~> 2.2.1"
24
25
  end
@@ -9,3 +9,4 @@ end
9
9
 
10
10
  require 'jsshuffle/methods/method.rb'
11
11
  require 'jsshuffle/methods/variable_renaming.rb'
12
+ require 'jsshuffle/methods/parameter_renaming.rb'
@@ -47,9 +47,9 @@ module JsShuffle::Methods
47
47
 
48
48
  # Make sure +#respond_to?+ works like expected, even though this class provides the hooks
49
49
  def self.inherited( subclass )
50
- undef_method :preprocess
51
- undef_method :process
52
- undef_method :postprocess
50
+ undef_method :preprocess rescue ""
51
+ undef_method :process rescue ""
52
+ undef_method :postprocess rescue ""
53
53
  super
54
54
  end
55
55
  end
@@ -0,0 +1,17 @@
1
+ module JsShuffle::Methods
2
+ # Replaces local variable names with a randomly generated new one
3
+ #
4
+ # pass +:parameter_renaming+ in the +:use+ array of a {Parser}[rdoc-ref:JsShuffle::Parser] to use this +Method+.
5
+ class ParameterRenaming < Method
6
+ JsShuffle::Methods.methods[:parameter_renaming] = self
7
+
8
+ def process( ast, shuffler )
9
+ functionNodes = ast.select { |node| node.is_a? RKelly::Nodes::FunctionDeclNode }
10
+ functionNodes.each do |node|
11
+ renamed_parameters = {}
12
+ node.arguments.each { |arg| renamed_parameters[arg.value] = (arg.value = shuffler.random_new_name) }
13
+ node.function_body.value.each { |child| child.value = renamed_parameters[child.value] if child.is_a? RKelly::Nodes::ResolveNode and renamed_parameters.has_key? child.value }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -6,7 +6,7 @@ module JsShuffle::Methods
6
6
  JsShuffle::Methods.methods[:variable_renaming] = self
7
7
 
8
8
  def process( ast, shuffler )
9
- sourceNodes = ast.select do |node| node.is_a? RKelly::Nodes::SourceElementsNode end
9
+ sourceNodes = ast.select { |node| node.is_a? RKelly::Nodes::SourceElementsNode }
10
10
  sourceNodes.each do |node|
11
11
  renamed_variables = {}
12
12
  node.value.each do |child|
@@ -15,9 +15,7 @@ module JsShuffle::Methods
15
15
  elsif child.is_a? RKelly::Nodes::ResolveNode
16
16
  child.value = renamed_variables[child.value] if renamed_variables.has_key? child.value
17
17
  else
18
- child.each do |n|
19
- n.value = renamed_variables[n.value] if n.is_a? RKelly::Nodes::ResolveNode and renamed_variables.has_key? n.value
20
- end
18
+ child.each { |n| n.value = renamed_variables[n.value] if n.is_a? RKelly::Nodes::ResolveNode and renamed_variables.has_key? n.value }
21
19
  end
22
20
  end
23
21
  end
@@ -9,7 +9,7 @@ module JsShuffle
9
9
  # A +Symbol+, +Proc+ or a +Class+ inheriting from {JsShuffle::Methods::Method}[rdoc-ref:JsShuffle::Methods::Method] or an +Array+ mixing any of these types.
10
10
  # Symbols are matched to JsShuffle's native {Methods}[rdoc-ref:JsShuffle::Methods] and should be lowercased and underscored (like the filenames of the corresponding +Method+)
11
11
  # Procs are called three times and receive the +pass+ (one of +:preprocess+, +:process+ or +postprocess+), the AST and the {Shuffler}[rdoc-ref:JsShuffle::Shuffler] instance. In the last pass the js string is passed instead of the AST and the Proc is expected to return the modified string
12
- def initialize( hash={ use: :variable_renaming } )
12
+ def initialize( hash={ use: [:variable_renaming, :parameter_renaming] } )
13
13
  @methods = hash[:use]
14
14
  @methods = [ @methods ] if @methods.is_a? Symbol
15
15
 
@@ -22,9 +22,7 @@ module JsShuffle
22
22
  end
23
23
 
24
24
  @defaults = {}
25
- @methods.each do |m|
26
- @defaults.merge! m.default_config if m.is_a? JsShuffle::Methods::Method
27
- end
25
+ @methods.each { |m| @defaults.merge! m.default_config if m.is_a? JsShuffle::Methods::Method }
28
26
  end
29
27
 
30
28
  # Shuffle a javascript program string and return the result
@@ -57,7 +55,7 @@ module JsShuffle
57
55
  @new_names = []
58
56
  ast = hash[:ast] || @parser.parse( hash[:js] )
59
57
 
60
- @methods.each do |m| m.configure options if m.is_a? JsShuffle::Methods::Method end
58
+ @methods.each { |m| m.configure options if m.is_a? JsShuffle::Methods::Method }
61
59
 
62
60
  [:preprocess, :process].each do |pass|
63
61
  @methods.each do |m|
@@ -79,7 +77,7 @@ module JsShuffle
79
77
  return @parser.parse( js ) if hash[:ast]
80
78
  js
81
79
  end
82
-
80
+
83
81
  # Generates a random new symbol name
84
82
  def random_new_name
85
83
  begin
@@ -1,3 +1,3 @@
1
1
  module Jsshuffle
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,45 @@
1
+ require 'test/unit'
2
+ require 'jsshuffle'
3
+ require 'execjs'
4
+
5
+ class ParameterRenamingTest < Test::Unit::TestCase
6
+ def test_can_include
7
+ assert_nothing_raised do
8
+ @shuffler = JsShuffle::Shuffler.new use: :parameter_renaming
9
+ end
10
+ end
11
+
12
+ def test_name_changes
13
+ assert_nothing_raised { @shuffler = JsShuffle::Shuffler.new use: :parameter_renaming }
14
+ original = %Q(
15
+ function double(parameter) {
16
+ return parameter*2;
17
+ }
18
+ )
19
+ assert_not_equal original,
20
+ @shuffler.shuffle( js: original )
21
+ end
22
+
23
+ def test_code_works
24
+ assert_nothing_raised { @shuffler = JsShuffle::Shuffler.new use: :parameter_renaming }
25
+ shuffled = @shuffler.shuffle js: %Q(
26
+ function double(parameter) {
27
+ return parameter*2;
28
+ }
29
+ return double(333);
30
+ )
31
+ assert_equal 666,
32
+ ExecJS.exec( shuffled )
33
+ end
34
+
35
+ def test_references_updated
36
+ assert_nothing_raised { @shuffler = JsShuffle::Shuffler.new use: :parameter_renaming }
37
+ assert_no_match /parameter/,
38
+ @shuffler.shuffle( js: %Q(
39
+ function double(parameter) {
40
+ return parameter*2;
41
+ }
42
+ return double(333);
43
+ ))
44
+ end
45
+ end
@@ -0,0 +1,38 @@
1
+ require 'test/unit'
2
+ require 'jsshuffle'
3
+ require 'execjs'
4
+
5
+ class ShufflerTest < Test::Unit::TestCase
6
+ def test_instantiate
7
+ assert_nothing_raised do
8
+ @shuffler = JsShuffle::Shuffler.new
9
+ end
10
+ end
11
+
12
+ def test_default_does_something
13
+ assert_nothing_raised { @shuffler = JsShuffle::Shuffler.new }
14
+ original = "var beers_i_had = 5; return beers_i_had;"
15
+ shuffled = @shuffler.shuffle js: original
16
+
17
+ assert_not_equal original, shuffled
18
+
19
+ assert_equal 5,
20
+ ExecJS.exec( shuffled )
21
+ end
22
+
23
+ def test_code_works
24
+ assert_nothing_raised { @shuffler = JsShuffle::Shuffler.new }
25
+ shuffled = @shuffler.shuffle js: %Q(
26
+ var twelve = 12;
27
+ twelve = twelve + 2;
28
+ function subtract_three( number ) {
29
+ var local = number - 3;
30
+ return local;
31
+ }
32
+ return subtract_three( twelve ) + "-ish";
33
+ )
34
+
35
+ assert_equal "11-ish",
36
+ ExecJS.exec( shuffled )
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ require 'test/unit'
2
+ require 'jsshuffle'
3
+ require 'execjs'
4
+
5
+ class VariableRenamingTest < Test::Unit::TestCase
6
+ def setup
7
+ @shuffler = JsShuffle::Shuffler.new use: :variable_renaming
8
+ end
9
+
10
+ def test_name_changes
11
+ original = "var beers_i_had = 5;"
12
+ assert_not_equal original,
13
+ @shuffler.shuffle( js: original )
14
+ end
15
+
16
+ def test_references_updated
17
+ assert_no_match /is_working/,
18
+ @shuffler.shuffle( js: %Q(
19
+ var is_working = true;
20
+ return is_working;
21
+ ))
22
+ end
23
+
24
+ def test_code_works
25
+ shuffled = @shuffler.shuffle js: %Q(
26
+ var twelve = 12;
27
+ twelve = twelve + 2;
28
+ return twelve;
29
+ )
30
+
31
+ assert_equal 14,
32
+ ExecJS.exec( shuffled )
33
+ end
34
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsshuffle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-08-23 00:00:00.000000000 Z
12
+ date: 2014-08-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -19,7 +19,7 @@ dependencies:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
21
  version: '1.6'
22
- type: :development
22
+ type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
@@ -35,7 +35,7 @@ dependencies:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
37
  version: '10.0'
38
- type: :development
38
+ type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  none: false
@@ -59,6 +59,22 @@ dependencies:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: 0.0.6
62
+ - !ruby/object:Gem::Dependency
63
+ name: execjs
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 2.2.1
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.2.1
62
78
  description:
63
79
  email:
64
80
  - s0lll0s@blinkenshell.org
@@ -77,10 +93,14 @@ files:
77
93
  - lib/jsshuffle.rb
78
94
  - lib/jsshuffle/methods.rb
79
95
  - lib/jsshuffle/methods/method.rb
96
+ - lib/jsshuffle/methods/parameter_renaming.rb
80
97
  - lib/jsshuffle/methods/variable_renaming.rb
81
98
  - lib/jsshuffle/railtie.rb
82
99
  - lib/jsshuffle/shuffler.rb
83
100
  - lib/jsshuffle/version.rb
101
+ - test/test_parameter_renaming.rb
102
+ - test/test_shuffler.rb
103
+ - test/test_variable_renaming.rb
84
104
  homepage: ''
85
105
  licenses:
86
106
  - MIT
@@ -106,4 +126,7 @@ rubygems_version: 1.8.23
106
126
  signing_key:
107
127
  specification_version: 3
108
128
  summary: A library to just-in-time randomly obfuscate JS
109
- test_files: []
129
+ test_files:
130
+ - test/test_parameter_renaming.rb
131
+ - test/test_shuffler.rb
132
+ - test/test_variable_renaming.rb