phantom_proxy 1.1.0 → 1.2.0

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/README.rdoc CHANGED
@@ -40,5 +40,9 @@ You can see the current proxy status by pointing your browser to
40
40
  phantom_proxy_control_panel
41
41
  if you have set the proxy or just to the address and port the proxy is running at
42
42
  address:port/phantom_proxy_control_panel
43
+
44
+ Security(1.2.0)
45
+ Now the phantom_proxy can be secured with a key. The system is implemented with an hmac algorithm.
46
+ Simply supply "-hmac THE_KEY" when starting the proxy and the proxy is secured
43
47
 
44
48
  == TODO
data/bin/phantom_proxy CHANGED
@@ -24,14 +24,37 @@ options = {
24
24
  :log_output => true
25
25
  }
26
26
  #Daemons.daemonize(options)
27
+
28
+ PARAMETERS = Array.new
29
+
30
+ hmac_key = nil
27
31
  phantom = false
32
+ last_arg = nil
28
33
  ARGV.each { |arg|
29
- phantom = true if /-self/.match(arg)
34
+ if !/-hmac/.match(arg) && !/-hmac/.match(last_arg) && !/-self/.match(arg)
35
+ PARAMETERS << arg
36
+ end
37
+ phantom = true if /-self/.match(arg)
38
+ hmac_key = arg if /-hmac/.match(last_arg)
39
+ last_arg = arg
30
40
  }
31
41
 
42
+ if hmac_key
43
+ if !File.directory?("/tmp/phantom_proxy")
44
+ Dir.mkdir("/tmp/phantom_proxy")
45
+ end
46
+
47
+ File.open("/tmp/phantom_proxy/key", 'w+') {|f| f.write(hmac_key) }
48
+ else
49
+ begin
50
+ File.delete("/tmp/phantom_proxy/key")
51
+ rescue
52
+ end
53
+ end
54
+
32
55
  if !phantom
33
- startoptions = ["start", "-R", PhantomJSProxy::CONFIG, "-P", "/tmp/pids/phantom_proxy.pid", "--tag", "phantom_proxy"]+ARGV
34
- Thin::Runner.new(startoptions).run!
56
+ startoptions = ["start", "-R", PhantomJSProxy::CONFIG, "-P", "/tmp/pids/phantom_proxy.pid", "--tag", "phantom_proxy"]+PARAMETERS
57
+ runner = Thin::Runner.new(startoptions).run!
35
58
  else
36
59
  Thin::Server.start(PhantomJSProxy::PhantomJSServer.new, ARGV[0], ARGV[1], ARGV[2])
37
60
  end
@@ -24,10 +24,10 @@ module PhantomJSProxy
24
24
  end
25
25
 
26
26
  if pictureOnly
27
- if !File.directory?("/tmp/phantomjs_proxy")
28
- Dir.mkdir("/tmp/phantomjs_proxy")
27
+ if !File.directory?("/tmp/phantom_proxy")
28
+ Dir.mkdir("/tmp/phantom_proxy")
29
29
  end
30
- pictureFile = Tempfile.new(["phantomjs_proxy/page", ".png"])
30
+ pictureFile = Tempfile.new(["phantom_proxy/page", ".png"])
31
31
  picture = pictureFile.path
32
32
  end
33
33
 
@@ -75,7 +75,7 @@ module PhantomJSProxy
75
75
  def invokePhantomJS(script, args)
76
76
  argString = " "+args.join(" ")
77
77
  puts("Call phantomJS with: "+argString)
78
- out = IO.popen(PHANTOMJS_BIN+" --cookies-file=/tmp/phantomjs_proxy/cookies.txt "+script+argString)
78
+ out = IO.popen(PHANTOMJS_BIN+" --cookies-file=/tmp/phantom_proxy/cookies.txt "+script+argString)
79
79
  o = out.readlines.join
80
80
  puts("PHANTOMJS_OUT: "+o)
81
81
  return o
@@ -1,12 +1,27 @@
1
1
  require 'net/http'
2
+ require 'hmac-md5'
2
3
 
3
4
  module PhantomJSProxy
4
5
  class PhantomJSServer
5
- def initialize()
6
+ def initialize
6
7
  @control_panel = PhantomJSProxy::PhantomJSControlPanel.new
8
+
9
+ #load key
10
+ @hmac_activated = false
11
+ @hmac = nil
12
+ if File.directory?("/tmp/phantom_proxy")
13
+ if File.exists?("/tmp/phantom_proxy/key")
14
+ key = File.open("/tmp/phantom_proxy/key", "r").read
15
+ #puts "HMAC_KEY: #{key}"
16
+ @hmac_activated = true
17
+ @hmac = HMAC::MD5.new key
18
+ end
19
+ end
7
20
  end
8
21
 
9
22
  attr_accessor :control_panel
23
+ attr_accessor :hmac
24
+ attr_accessor :hmac_activated
10
25
 
11
26
  def check_for_route(url)
12
27
  if /\.js/i.match(url)
@@ -42,6 +57,19 @@ module PhantomJSProxy
42
57
  resp.finish
43
58
  end
44
59
 
60
+ def check_request_security req, env
61
+ client_key = env['HTTP_HMAC_KEY']
62
+ client_time= Time.parse(env['HTTP_HMAC_TIME'])
63
+ remote_time= Time.now
64
+ remote_key = hmac.update(env['REQUEST_URI']+env['HTTP_HMAC_TIME']).hexdigest
65
+
66
+ if (client_key != remote_key || (remote_time-client_time).abs > 120)
67
+ control_panel.add_special_request "@did not pass security check"
68
+ return false
69
+ end
70
+ return true
71
+ end
72
+
45
73
  def call(env)
46
74
  control_panel.add_request
47
75
 
@@ -50,7 +78,21 @@ module PhantomJSProxy
50
78
  haha = env.collect { |k, v| "#{k} : #{v}\n" }.join
51
79
  env['rack.errors'].write("The request: "+req.url()+"\nGET: "+haha+"\n")
52
80
 
53
- params = req.params.collect { |k, v| "#{k}=#{v}&\n" }.join
81
+ if hmac_activated && !check_request_security(req, env)
82
+ resp = Rack::Response.new([], 503, {
83
+ 'Content-Type' => 'text/html'
84
+ }) { |r|
85
+ r.write("Security ERROR")
86
+ }
87
+ return resp.finish
88
+ end
89
+
90
+ https_request = false
91
+ if /\:443/.match(req.url())
92
+ https_request = true
93
+ end
94
+
95
+ params = req.params.collect { |k, v| "#{k}=#{v}&" }.join
54
96
  env['rack.errors'].write("Paramas: "+params+"\n")
55
97
 
56
98
  #this routes the request to the outgoing server incase its not html that we want to load
@@ -79,6 +121,11 @@ module PhantomJSProxy
79
121
  end
80
122
 
81
123
  url = env['REQUEST_URI'];
124
+ if https_request
125
+ url['http'] = 'https'
126
+ url[':443'] = ''
127
+ end
128
+
82
129
  if params.length > 0
83
130
  url += '?'+params;
84
131
  end
@@ -5,7 +5,7 @@ var frameCount = 1;
5
5
  var frameContent = [];
6
6
  var masterURL = "";
7
7
 
8
- evaluateWithVars = function(page, func, vars)
8
+ function evaluateWithVars(page, func, vars)
9
9
  {
10
10
  var fstr = func.toString()
11
11
  //console.log(fstr.replace("function () {", "function () {\n"+vstr))
@@ -20,7 +20,7 @@ evaluateWithVars = function(page, func, vars)
20
20
  return page.evaluate(evalstr)
21
21
  }
22
22
 
23
- var insertFrames = function(url) {
23
+ function insertFrames(url) {
24
24
  var page = require('webpage').create();
25
25
  page.onConsoleMessage = function (msg) { console.log(msg); };
26
26
  page.onAlert = function(msg) { console.log(msg);};
File without changes
data/lib/phantom_proxy.rb CHANGED
@@ -4,7 +4,7 @@ module PhantomJSProxy
4
4
  ROOT = File.expand_path(File.dirname(__FILE__))
5
5
  SCRIPT = ROOT+"/phantom_proxy/scripts/proxy.js"
6
6
  CONTROL_PANEL = ROOT+"/phantom_proxy/web/control_panel.html"
7
- PHANTOMJS_BIN = ROOT+'/../bin/phantomjs'
7
+ PHANTOMJS_BIN = ROOT+'/phantom_proxy/vendor/bin/phantomjs'
8
8
  end
9
9
 
10
10
  require PhantomJSProxy::ROOT+'/phantom_proxy/phantomjs.rb'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phantom_proxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
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: 2012-04-19 00:00:00.000000000 Z
12
+ date: 2012-05-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thin
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: 1.3.1
30
+ - !ruby/object:Gem::Dependency
31
+ name: ruby-hmac
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.4.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.4.0
30
46
  description: This is a phyntonjs Proxy it allows you to fetch webpages and execute
31
47
  javascript in them.
32
48
  email: suddani@googlemail.com
@@ -42,8 +58,8 @@ files:
42
58
  - lib/phantom_proxy/scripts/proxy.js
43
59
  - lib/phantom_proxy/config.ru
44
60
  - lib/phantom_proxy/web/control_panel.html
61
+ - lib/phantom_proxy/vendor/bin/phantomjs
45
62
  - bin/phantom_proxy
46
- - bin/phantomjs
47
63
  - README.rdoc
48
64
  - Gemfile
49
65
  homepage: http://experteer.com