jsshuffle 0.0.1
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/.gitignore +16 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +4 -0
- data/Rakefile +2 -0
- data/bin/jsshuffle +4 -0
- data/jsshuffle.gemspec +24 -0
- data/lib/jsshuffle/methods/method.rb +56 -0
- data/lib/jsshuffle/methods/variable_renaming.rb +26 -0
- data/lib/jsshuffle/methods.rb +11 -0
- data/lib/jsshuffle/railtie.rb +7 -0
- data/lib/jsshuffle/shuffler.rb +91 -0
- data/lib/jsshuffle/version.rb +3 -0
- data/lib/jsshuffle.rb +10 -0
- metadata +109 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 TODO: Write your name
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
data/Rakefile
ADDED
data/bin/jsshuffle
ADDED
data/jsshuffle.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'jsshuffle/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "jsshuffle"
|
8
|
+
spec.version = Jsshuffle::VERSION
|
9
|
+
spec.authors = ["S0lll0s / Sol Bekic"]
|
10
|
+
spec.email = ["s0lll0s@blinkenshell.org"]
|
11
|
+
spec.summary = %q{A library to just-in-time randomly obfuscate JS}
|
12
|
+
spec.homepage = ""
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
21
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
22
|
+
|
23
|
+
spec.add_runtime_dependency "rkelly-remix", "~> 0.0.6"
|
24
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module JsShuffle::Methods
|
2
|
+
|
3
|
+
# Wraps up a +Method+ to obfuscate / shuffle the JS.
|
4
|
+
#
|
5
|
+
# When subclassing +Method+ define one or more of the three processing hooks:
|
6
|
+
# +preprocess+:: called in the first pass, this hook shouldn't modify the AST
|
7
|
+
# +process+:: called as the second pass. Modify the AST here
|
8
|
+
# +postprocess+:: called last. This method gets passed the js in string form and is expected to return a string itself
|
9
|
+
class Method
|
10
|
+
# Returns the hash of default options the +Method+ accepts in the {configure}[rdoc-ref:JsShuffle::Methods::method#configure] method
|
11
|
+
def default_config
|
12
|
+
return {}
|
13
|
+
end
|
14
|
+
|
15
|
+
# Configures the +Method+ instance given the option hash
|
16
|
+
#
|
17
|
+
# Parameters:
|
18
|
+
# +options+:: The options hash
|
19
|
+
def configure( options )
|
20
|
+
@options = options
|
21
|
+
end
|
22
|
+
|
23
|
+
# Called in the first pass. Don't modify the AST in here!
|
24
|
+
#
|
25
|
+
# Parameters:
|
26
|
+
# +ast+:: The JS AST
|
27
|
+
# +shuffler:: The {Shuffler}[rdoc-ref:JsShuffle::Shuffler] calling the hook
|
28
|
+
def preprocess( ast, shuffler )
|
29
|
+
end
|
30
|
+
|
31
|
+
# Called in the second pass. Modify the AST here
|
32
|
+
#
|
33
|
+
# Parameters:
|
34
|
+
# +js+:: The JS AST
|
35
|
+
# +shuffler:: The {Shuffler}[rdoc-ref:JsShuffle::Shuffler] calling the hook
|
36
|
+
def process( ast, shuffler )
|
37
|
+
end
|
38
|
+
|
39
|
+
# Called last of the three hooks. Return the js!
|
40
|
+
#
|
41
|
+
# Parameters:
|
42
|
+
# +js+:: The JS in string form
|
43
|
+
# +shuffler:: The {Shuffler}[rdoc-ref:JsShuffle::Shuffler] calling the hook
|
44
|
+
def postprocess( js, shuffler )
|
45
|
+
js
|
46
|
+
end
|
47
|
+
|
48
|
+
# Make sure +#respond_to?+ works like expected, even though this class provides the hooks
|
49
|
+
def self.inherited( subclass )
|
50
|
+
undef_method :preprocess
|
51
|
+
undef_method :process
|
52
|
+
undef_method :postprocess
|
53
|
+
super
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module JsShuffle::Methods
|
2
|
+
# Replaces local variable names with a randomly generated new one
|
3
|
+
#
|
4
|
+
# pass +:variable_renaming+ in the +:use+ array of a {Parser}[rdoc-ref:JsShuffle::Parser] to use this +Method+.
|
5
|
+
class VariableRenaming < Method
|
6
|
+
JsShuffle::Methods.methods[:variable_renaming] = self
|
7
|
+
|
8
|
+
def process( ast, shuffler )
|
9
|
+
sourceNodes = ast.select do |node| node.is_a? RKelly::Nodes::SourceElementsNode end
|
10
|
+
sourceNodes.each do |node|
|
11
|
+
renamed_variables = {}
|
12
|
+
node.value.each do |child|
|
13
|
+
if child.is_a? RKelly::Nodes::VarStatementNode
|
14
|
+
renamed_variables[child.value.first.name] = (child.value.first.name = shuffler.random_new_name )
|
15
|
+
elsif child.is_a? RKelly::Nodes::ResolveNode
|
16
|
+
child.value = renamed_variables[child.value] if renamed_variables.has_key? child.value
|
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
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module JsShuffle
|
2
|
+
|
3
|
+
# Shuffles a js-program or {RKelly AST}[rdoc-ref:RKelly::Nodes]
|
4
|
+
# rdoc-ref:RDoc::Markup
|
5
|
+
class Shuffler
|
6
|
+
# Instantiate a new {Shuffler}[rdoc-ref:JsShuffle::Shuffler]
|
7
|
+
# Parameters:
|
8
|
+
# +use+::
|
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
|
+
# 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
|
+
# 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 } )
|
13
|
+
@methods = hash[:use]
|
14
|
+
@methods = [ @methods ] if @methods.is_a? Symbol
|
15
|
+
|
16
|
+
@parser = RKelly::Parser.new
|
17
|
+
|
18
|
+
@methods.collect! do |m|
|
19
|
+
next (JsShuffle::Methods.methods[m]).new if m.is_a? Symbol
|
20
|
+
next m.new if m.is_a? JsShuffle::Methods::Method
|
21
|
+
m
|
22
|
+
end
|
23
|
+
|
24
|
+
@defaults = {}
|
25
|
+
@methods.each do |m|
|
26
|
+
@defaults.merge! m.default_config if m.is_a? JsShuffle::Methods::Method
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Shuffle a javascript program string and return the result
|
31
|
+
#
|
32
|
+
# Used to make {Shuffler}[rdoc-ref:JsShuffle::Shuffler] available as a +Rails+ JS Preprocessor
|
33
|
+
#
|
34
|
+
# Parameters:
|
35
|
+
# +source+::
|
36
|
+
# The js source string
|
37
|
+
def compress( source )
|
38
|
+
shuffle js: source
|
39
|
+
end
|
40
|
+
|
41
|
+
# Shuffle a js-string or a {RKelly AST}[rdoc-ref:RKelly::Nodes]
|
42
|
+
#
|
43
|
+
# Parameters:
|
44
|
+
# +options+::
|
45
|
+
# an option hash containing either
|
46
|
+
# +js+:: the javascript source code as a string _or_
|
47
|
+
# +ast+:: the parsed javascript source as {RKelly AST}[rdoc-ref:RKelly::Nodes]
|
48
|
+
# and optionally the following options:
|
49
|
+
# +output+:: the output format, +:string+ or +:ast+
|
50
|
+
#
|
51
|
+
# all other options are passed on to the {Methods}[rdoc-ref:JsShuffle::Methods] supplied during initialization
|
52
|
+
#
|
53
|
+
# Returns either a +String+ or {RKelly AST}[rdoc-ref:Rkelly::Nodes], matching the input format or the +output+ value
|
54
|
+
def shuffle( hash={} )
|
55
|
+
hash = { js: hash } if hash.is_a? String
|
56
|
+
options = @defaults.merge(hash)
|
57
|
+
@new_names = []
|
58
|
+
ast = hash[:ast] || @parser.parse( hash[:js] )
|
59
|
+
|
60
|
+
@methods.each do |m| m.configure options if m.is_a? JsShuffle::Methods::Method end
|
61
|
+
|
62
|
+
[:preprocess, :process].each do |pass|
|
63
|
+
@methods.each do |m|
|
64
|
+
next m.send( pass, ast, self ) if m.is_a? JsShuffle::Methods::Method and m.respond_to? pass
|
65
|
+
m.call( pass, ast, self ) if m.respond_to? :call
|
66
|
+
end
|
67
|
+
end
|
68
|
+
js = ast.to_ecma
|
69
|
+
@methods.each do |m|
|
70
|
+
next (js = m.postprocess( ast, self )) if m.is_a? JsShuffle::Methods::Method and m.respond_to? :postprocess
|
71
|
+
js = m.call( :postprocess, js, self ) if m.respond_to? :call
|
72
|
+
end
|
73
|
+
|
74
|
+
if hash.has_key? :output
|
75
|
+
return js if hash[:output] == :string
|
76
|
+
return @parser.parse( js )
|
77
|
+
end
|
78
|
+
|
79
|
+
return @parser.parse( js ) if hash[:ast]
|
80
|
+
js
|
81
|
+
end
|
82
|
+
|
83
|
+
# Generates a random new symbol name
|
84
|
+
def random_new_name
|
85
|
+
begin
|
86
|
+
new_name = ('a'..'z').to_a.shuffle[0,8].join
|
87
|
+
end while @new_names.include? new_name
|
88
|
+
new_name
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
data/lib/jsshuffle.rb
ADDED
metadata
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jsshuffle
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- S0lll0s / Sol Bekic
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-08-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.6'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.6'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '10.0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '10.0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rkelly-remix
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.0.6
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.0.6
|
62
|
+
description:
|
63
|
+
email:
|
64
|
+
- s0lll0s@blinkenshell.org
|
65
|
+
executables:
|
66
|
+
- jsshuffle
|
67
|
+
extensions: []
|
68
|
+
extra_rdoc_files: []
|
69
|
+
files:
|
70
|
+
- .gitignore
|
71
|
+
- Gemfile
|
72
|
+
- LICENSE.txt
|
73
|
+
- README.md
|
74
|
+
- Rakefile
|
75
|
+
- bin/jsshuffle
|
76
|
+
- jsshuffle.gemspec
|
77
|
+
- lib/jsshuffle.rb
|
78
|
+
- lib/jsshuffle/methods.rb
|
79
|
+
- lib/jsshuffle/methods/method.rb
|
80
|
+
- lib/jsshuffle/methods/variable_renaming.rb
|
81
|
+
- lib/jsshuffle/railtie.rb
|
82
|
+
- lib/jsshuffle/shuffler.rb
|
83
|
+
- lib/jsshuffle/version.rb
|
84
|
+
homepage: ''
|
85
|
+
licenses:
|
86
|
+
- MIT
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
requirements: []
|
104
|
+
rubyforge_project:
|
105
|
+
rubygems_version: 1.8.23
|
106
|
+
signing_key:
|
107
|
+
specification_version: 3
|
108
|
+
summary: A library to just-in-time randomly obfuscate JS
|
109
|
+
test_files: []
|