arachni-rpc-pure 0.1.2 → 0.2

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 12c56321178ecdc10170f910b5c2e2f78d473caa
4
+ data.tar.gz: 54380412a7a078f9ea47d0e48933e54b1b85a950
5
+ SHA512:
6
+ metadata.gz: 11facfba44fdab2235e65bb40ed95c49b017187d9fa4510e3c9aec6cdbf5a1d25b86c37b03a43afad8d489e8abb0273f008d43a6ce24d6d4c7b987c32c96d0a5
7
+ data.tar.gz: cef06f2269e9cef578053bc70ac52a228314e68cf48a4372456abc6ec03e7b27064582910593a3c2f50f557e58379df61806109d694f227b32fbd50be10663eb
@@ -1,4 +1,9 @@
1
1
  # ChangeLog
2
2
 
3
+ ## Version 0.2 _(August 29, 2014)_
4
+
5
+ - Re-purposed to be a client reference for Arachni specifically rather than Arachni-RPC.
6
+
3
7
  ## Version 0.1.2 _(February 11, 2013)_
8
+
4
9
  - Updated ```arachni-rpc``` dependency to ```0.1.3```.
data/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # License
2
2
 
3
- Copyright (C) 2011, Tasos Laskos <tasos.laskos@gmail.com>
3
+ Copyright (C) 2011, Tasos Laskos <tasos.laskos@arachni-scanner.com>
4
4
  All rights reserved.
5
5
 
6
6
  Redistribution and use in source and binary forms, with or without modification,
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # Arachni-RPC Pure
2
+
2
3
  <table>
3
4
  <tr>
4
5
  <th>Version</th>
5
- <td>0.1.1</td>
6
+ <td>0.2</td>
6
7
  </tr>
7
8
  <tr>
8
9
  <th>Github page</th>
@@ -14,7 +15,7 @@
14
15
  </tr>
15
16
  <tr>
16
17
  <th>Author</th>
17
- <td><a href="mailto:tasos.laskos@gmail.com">Tasos</a> "<a href="mailto:zapotek@segfault.gr">Zapotek</a>" <a href="mailto:tasos.laskos@gmail.com">Laskos</a></td>
18
+ <td><a href="mailto:tasos.laskos@arachni-scanner.com">Tasos Laskos</a></td>
18
19
  </tr>
19
20
  <tr>
20
21
  <th>Twitter</th>
@@ -22,7 +23,7 @@
22
23
  </tr>
23
24
  <tr>
24
25
  <th>Copyright</th>
25
- <td>2011</td>
26
+ <td>2011-2014</td>
26
27
  </tr>
27
28
  <tr>
28
29
  <th>License</th>
@@ -32,12 +33,18 @@
32
33
 
33
34
  ## Synopsis
34
35
 
35
- Arachni-RPC Pure is a simple implementation of a client for the <a href="http://github.com/Arachni/arachni-rpc-pure">Arachni-RPC</a> protocol.<br/>
36
- It's written in pure Ruby using SSL sockets and does not have any 3rd party dependencies -- besides the Arachni-RPC spec itself.
36
+ Arachni-RPC Pure is a simple implementation of a client for the
37
+ [Arachni-RPC](http://github.com/Arachni/arachni-rpc) protocol and comes
38
+ pre-configured with a suitable serializer (MessagePack basically) for
39
+ communicating with [Arachni](http://github.com/Arachni/arachni)'s services.
40
+
41
+ It is, in essence, a very simple, reference implementation for people who want
42
+ to write their own clients in order to communicate with
43
+ [Arachni](http://github.com/Arachni/arachni).
37
44
 
38
45
  ## Usage
39
46
 
40
- Check out the files in the <i>examples/</i> directory, they go through everything in great detail.
47
+ Usages examples are in the `examples/` directory.
41
48
 
42
49
  ## Installation
43
50
 
@@ -55,7 +62,9 @@ If you want to clone the repository and work with the source code:
55
62
 
56
63
  ## Running the Specs
57
64
 
58
- In order to run the specs you must first fire up 2 sample servers although they are not part of this project -- as it is only a client implementation.<br/>
65
+ In order to run the specs you must first fire up 2 sample servers although they
66
+ are not part of this project -- as it is only a client implementation.
67
+
59
68
  You can find the required servers in the [Arachni-RPC EM](https://github.com/Arachni/arachni-rpc-em) project.
60
69
 
61
70
  From inside the Arachni-RPC EM directory run:
@@ -73,6 +82,8 @@ Please send your feedback using Github's issue system at
73
82
 
74
83
 
75
84
  ## License
76
- Arachni-RPC Pure is provided under the 3-clause BSD license.<br/>
85
+
86
+ Arachni-RPC Pure is provided under the 3-clause BSD license.
87
+
77
88
  See the [LICENSE](file.LICENSE.html) file for more information.
78
89
 
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
 
3
3
  This file is part of the Arachni-RPC Pure project and may be subject to
4
- redistribution and commercial restrictions. Please see the Arachni-RPC EM
4
+ redistribution and commercial restrictions. Please see the Arachni-RPC Pure
5
5
  web site for more information on licensing and terms of use.
6
6
 
7
7
  =end
@@ -1,63 +1,51 @@
1
- require File.join( File.expand_path( File.dirname( __FILE__ ) ), '../lib/arachni/rpc/', 'pure' )
1
+ require_relative '../lib/arachni/rpc/pure'
2
2
 
3
- # require 'arachni/rpc/pure'
4
- require 'pp'
3
+ dispatcher = Arachni::RPC::Pure::Client.new(
4
+ host: '127.0.0.1',
5
+ port: 7331
6
+ )
5
7
 
6
- client = Arachni::RPC::Pure::Client.new(
7
- :host => 'localhost',
8
- :port => 7332,
9
- :token => 'superdupersecret',
10
- :serializer => Marshal
8
+ instance_info = dispatcher.call( 'dispatcher.dispatch', 'The Dude' )
9
+ # => {
10
+ # "token" => "1ac10910f41ce86e23ab954033b40a83",
11
+ # "pid" => 27031,
12
+ # "port" => 23496,
13
+ # "url" => "127.0.0.1:23496",
14
+ # "owner" => "The Dude",
15
+ # "birthdate" => "2014-08-05 19:54:07 +0300",
16
+ # "starttime" => "2014-08-05 19:54:58 +0300",
17
+ # "helpers" => {}
18
+ # }
19
+
20
+ instance = Arachni::RPC::Pure::Client.new(
21
+ host: '127.0.0.1',
22
+ port: instance_info['port'],
23
+ token: instance_info['token']
11
24
  )
12
25
 
26
+ p instance.call( 'service.alive?' )
27
+ # => true
28
+
13
29
  begin
14
- # 'bench2' doesn't exist...
15
- client.call( 'bench2.foo', 1 )
16
- rescue Arachni::RPC::Exceptions::InvalidObject => e
17
- pp e
18
- # => #<Arachni::RPC::Exceptions::InvalidObject: Trying to access non-existent object 'bench2'.>
30
+ instance.call( 'service.scan' )
31
+ rescue => e
32
+ # => #<RuntimeError: RemoteException: Option 'url' is mandatory.>
19
33
  end
20
34
 
21
- # This is just an echo method so it will return: 1
22
- pp client.call( 'bench.foo', 1 )
23
- # => 1
24
-
25
- # make access more natural, map (proxy actually) the remote object to a local one
26
- bench = Arachni::RPC::RemoteObjectMapper.new( client, 'bench' )
27
-
28
- pp bench.foo( 2 )
29
- # => 2
30
-
31
35
  begin
32
- # doesn't exist so we'll get an exception,
33
- # won't reach the remote object
34
- #
35
- bench.does_not_exist
36
- rescue Arachni::RPC::Exceptions::InvalidMethod => e
37
- pp e
38
- # => #<Arachni::RPC::Exceptions::InvalidMethod: Trying to access non-public method 'does_not_exist'.>
36
+ instance.call( 'service.error_test' )
37
+ rescue => e
38
+ # => #<RuntimeError: RemoteException: wrong number of arguments (0 for 1)>
39
39
  end
40
40
 
41
41
  begin
42
- # foo() expects an argument but arity is not checked so the call will be
43
- # forwarded to the remote object which will throw a remote exception
44
- bench.foo
45
- rescue Arachni::RPC::Exceptions::RemoteException => e
46
- pp e
47
- # => #<Arachni::RPC::Exceptions::RemoteException: wrong number of arguments (0 for 1)>
42
+ instance.call( 'service.blahblah' )
43
+ rescue => e
44
+ # => #<RuntimeError: InvalidMethod: Trying to access non-public method 'blahblah'.>
48
45
  end
49
46
 
50
- client = Arachni::RPC::Pure::Client.new(
51
- :host => 'localhost',
52
- :port => 7332,
53
- :token => 'invalidtoken',
54
- :serializer => Marshal
55
- )
56
-
57
47
  begin
58
- # the token is not valid so the remote server won't let us through
59
- client.call( 'bench.foo', 1 )
60
- rescue Arachni::RPC::Exceptions::InvalidToken => e
61
- pp e
62
- # => #<Arachni::RPC::Exceptions::InvalidToken: Token missing or invalid while calling: bench.foo>
48
+ instance.call( 'blahblah.stuff' )
49
+ rescue => e
50
+ # => #<RuntimeError: InvalidObject: Trying to access non-existent object 'blahblah'.>
63
51
  end
@@ -1,16 +1,10 @@
1
1
  =begin
2
2
 
3
3
  This file is part of the Arachni-RPC Pure project and may be subject to
4
- redistribution and commercial restrictions. Please see the Arachni-RPC EM
4
+ redistribution and commercial restrictions. Please see the Arachni-RPC Pure
5
5
  web site for more information on licensing and terms of use.
6
6
 
7
7
  =end
8
8
 
9
- require 'openssl'
10
- require 'socket'
11
- require 'yaml'
12
- YAML::ENGINE.yamler = 'syck'
13
-
14
- require 'arachni/rpc'
15
- require File.join( File.expand_path( File.dirname( __FILE__ ) ), 'pure', 'connection' )
16
- require File.join( File.expand_path( File.dirname( __FILE__ ) ), 'pure', 'client' )
9
+ require_relative 'pure/connection'
10
+ require_relative 'pure/client'
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
 
3
3
  This file is part of the Arachni-RPC Pure project and may be subject to
4
- redistribution and commercial restrictions. Please see the Arachni-RPC EM
4
+ redistribution and commercial restrictions. Please see the Arachni-RPC Pure
5
5
  web site for more information on licensing and terms of use.
6
6
 
7
7
  =end
@@ -10,51 +10,80 @@ module Arachni
10
10
  module RPC
11
11
  module Pure
12
12
 
13
+ # Very simple client, essentially establishes a {Connection} and performs
14
+ # requests.
15
+ #
16
+ # @author Tasos Laskos <tasos.laskos@arachni-scanner.com>
13
17
  class Client
14
18
 
15
- def initialize( opts )
16
- @opts = opts
19
+ # @param [Hash] options
20
+ # @option options [String] :host
21
+ # Hostname/IP address.
22
+ # @option options [Integer] :port
23
+ # Port number.
24
+ # @option options [String] :token
25
+ # Optional authentication token.
26
+ # @option options [String] :ssl_ca
27
+ # SSL CA certificate.
28
+ # @option options [String] :ssl_pkey
29
+ # SSL private key.
30
+ # @option options [String] :ssl_cert
31
+ # SSL certificate.
32
+ def initialize( options )
33
+ @options = options
17
34
  end
18
35
 
36
+ # @note Will establish a connection if none is available.
37
+ #
38
+ # Performs an RPC request and returns a response.
39
+ #
40
+ # @param [String] msg
41
+ # RPC message in the form of `handler.method`.
42
+ # @param [Array] args
43
+ # Collection of arguments to be passed to the method.
44
+ #
45
+ # @return [Object]
46
+ # Response object.
47
+ #
48
+ # @raise [RuntimeError]
49
+ # * If a connection error was encountered the relevant exception will be
50
+ # raised.
51
+ # * If the response object is a remote exception, one will also be raised
52
+ # locally.
19
53
  def call( msg, *args )
20
- conn = nil
21
- begin
22
- conn = Connection.new( @opts )
23
- rescue OpenSSL::SSL::SSLError => ex
24
- e = Arachni::RPC::Exceptions::SSLPeerVerificationFailed.new( ex.to_s )
25
- e.set_backtrace( ex.backtrace )
26
- raise e
27
- rescue Errno::ECONNREFUSED => ex
28
- e = Arachni::RPC::Exceptions::ConnectionError.new( ex.to_s )
29
- e.set_backtrace( ex.backtrace )
30
- raise e
31
- end
32
-
33
- response = conn.perform( request( msg, *args ) )
34
- conn.close
35
-
54
+ response = with_connection { |c| c.perform( request( msg, *args ) ) }
36
55
  handle_exception( response )
37
- return response.obj
56
+
57
+ response['obj']
38
58
  end
39
59
 
40
60
  private
41
61
 
42
- def handle_exception( response )
43
- if exception?( response )
44
- raise Arachni::RPC::Exceptions.from_response( response )
62
+ def with_connection( &block )
63
+ c = Connection.new( @options )
64
+
65
+ begin
66
+ block.call c
67
+ ensure
68
+ c.close
45
69
  end
46
70
  end
47
71
 
48
- def exception?( response )
49
- response.obj.is_a?( Hash ) && response.obj.include?( 'exception' )
72
+ def handle_exception( response )
73
+ return if !(data = response['exception'])
74
+
75
+ exception = RuntimeError.new( "#{data['type']}: #{data['message']}" )
76
+ exception.set_backtrace( data['backtrace'] )
77
+
78
+ raise exception
50
79
  end
51
80
 
52
81
  def request( msg, *args )
53
- Request.new(
54
- :message => msg,
55
- :args => args,
56
- :token => @opts[:token]
57
- )
82
+ {
83
+ message: msg,
84
+ args: args,
85
+ token: @options[:token]
86
+ }
58
87
  end
59
88
 
60
89
  end
@@ -1,46 +1,71 @@
1
1
  =begin
2
2
 
3
3
  This file is part of the Arachni-RPC Pure project and may be subject to
4
- redistribution and commercial restrictions. Please see the Arachni-RPC EM
4
+ redistribution and commercial restrictions. Please see the Arachni-RPC Pure
5
5
  web site for more information on licensing and terms of use.
6
6
 
7
7
  =end
8
8
 
9
+ require 'openssl'
10
+ require 'socket'
11
+ require 'zlib'
12
+ require 'msgpack'
13
+
9
14
  module Arachni
10
15
  module RPC
11
16
  module Pure
12
17
 
18
+ # Represents an RPC connection, which is basically an OpenSSL socket with
19
+ # the ability to serialize/unserialize RPC messages.
20
+ #
21
+ # @author Tasos Laskos <tasos.laskos@arachni-scanner.com>
13
22
  class Connection
14
23
 
15
- def initialize( opts )
16
- @opts = opts
17
-
18
- socket = TCPSocket.new( opts[:host], opts[:port] )
19
-
20
- @ssl_context = OpenSSL::SSL::SSLContext.new
21
-
22
- if opts[:ssl_cert] && opts[:ssl_pkey]
23
- @ssl_context.cert = OpenSSL::X509::Certificate.new( File.open( opts[:ssl_cert] ) )
24
- @ssl_context.key = OpenSSL::PKey::RSA.new( File.open( opts[:ssl_pkey] ) )
25
- @ssl_context.ca_file = opts[:ssl_ca]
26
- @ssl_context.verify_mode =
24
+ # @param [Hash] options
25
+ # @option options [String] :host
26
+ # Hostname/IP address.
27
+ # @option options [Integer] :port
28
+ # Port number.
29
+ # @option options [String] :ssl_ca
30
+ # SSL CA certificate.
31
+ # @option options [String] :ssl_pkey
32
+ # SSL private key.
33
+ # @option options [String] :ssl_cert
34
+ # SSL certificate.
35
+ def initialize( options )
36
+ context = OpenSSL::SSL::SSLContext.new
37
+
38
+ if options[:ssl_cert] && options[:ssl_pkey]
39
+ context.cert =
40
+ OpenSSL::X509::Certificate.new( File.open( options[:ssl_cert] ) )
41
+
42
+ context.key =
43
+ OpenSSL::PKey::RSA.new( File.open( options[:ssl_pkey] ) )
44
+
45
+ context.ca_file = options[:ssl_ca]
46
+ context.verify_mode =
27
47
  OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
28
48
  end
29
49
 
30
- @ssl_socket = OpenSSL::SSL::SSLSocket.new( socket, @ssl_context )
31
- @ssl_socket.sync_close = true
32
- @ssl_socket.connect
50
+ @socket = OpenSSL::SSL::SSLSocket.new(
51
+ TCPSocket.new( options[:host], options[:port] ),
52
+ context
53
+ )
54
+ @socket.sync_close = true
55
+ @socket.connect
33
56
  end
34
57
 
58
+ # Closes the connection.
35
59
  def close
36
- @ssl_socket.close
60
+ @socket.close
37
61
  end
38
62
 
63
+ # @param [Hash] request
64
+ # RPC request message data.
39
65
  def perform( request )
40
- Response.new( send_rcv_object( request.prepare_for_tx ) )
66
+ send_rcv_object( request )
41
67
  end
42
68
 
43
-
44
69
  private
45
70
 
46
71
  def send_rcv_object( obj )
@@ -49,12 +74,12 @@ class Connection
49
74
  end
50
75
 
51
76
  def send_object( obj )
52
- serialized = serializer.dump( obj )
53
- @ssl_socket.puts( [ serialized.bytesize, serialized ].pack( 'Na*' ) )
77
+ serialized = serialize( obj )
78
+ @socket.puts( [ serialized.bytesize, serialized ].pack( 'Na*' ) )
54
79
  end
55
80
 
56
81
  def receive_object
57
- while data = @ssl_socket.sysread( 99999 )
82
+ while data = @socket.sysread( 99999 )
58
83
  (@buf ||= '') << data
59
84
  while @buf.size >= 4
60
85
  if @buf.size >= 4 + ( size = @buf.unpack( 'N' ).first )
@@ -62,7 +87,7 @@ class Connection
62
87
 
63
88
  complete = @buf.slice!( 0, size )
64
89
  @buf = ''
65
- return serializer.load( complete )
90
+ return unserialize( complete )
66
91
  else
67
92
  break
68
93
  end
@@ -70,12 +95,31 @@ class Connection
70
95
  end
71
96
  end
72
97
 
73
- private
98
+ def serialize( object )
99
+ MessagePack.dump object
100
+ end
74
101
 
75
- def serializer
76
- @opts[:serializer] ? @opts[:serializer] : YAML
102
+ def unserialize( object )
103
+ MessagePack.load try_decompress( object )
77
104
  end
78
105
 
106
+ # @note Will return the `string` as is if it was not compressed.
107
+ #
108
+ # @param [String] string
109
+ # String to decompress.
110
+ #
111
+ # @return [String]
112
+ # Decompressed string.
113
+ def try_decompress( string )
114
+ # Just an ID representing a serialized, empty data structure.
115
+ return string if string.size == 1
116
+
117
+ begin
118
+ Zlib::Inflate.inflate string
119
+ rescue Zlib::DataError
120
+ string
121
+ end
122
+ end
79
123
 
80
124
  end
81
125
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
 
3
3
  This file is part of the Arachni-RPC Pure project and may be subject to
4
- redistribution and commercial restrictions. Please see the Arachni-RPC EM
4
+ redistribution and commercial restrictions. Please see the Arachni-RPC Pure
5
5
  web site for more information on licensing and terms of use.
6
6
 
7
7
  =end
@@ -9,7 +9,9 @@
9
9
  module Arachni
10
10
  module RPC
11
11
  module Pure
12
- VERSION = '0.1.2'
12
+
13
+ VERSION = '0.2'
14
+
13
15
  end
14
16
  end
15
17
  end
metadata CHANGED
@@ -1,92 +1,70 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: arachni-rpc-pure
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.2
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.2"
6
5
  platform: ruby
7
- authors:
6
+ authors:
8
7
  - Tasos Laskos
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-11 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: arachni-rpc
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - '='
20
- - !ruby/object:Gem::Version
21
- version: 0.1.3
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - '='
28
- - !ruby/object:Gem::Version
29
- version: 0.1.3
30
- description: ! ' Pure Ruby client implementation of the Arachni-RPC protocol.
31
11
 
32
- '
33
- email: tasos.laskos@gmail.com
12
+ date: 2014-08-29 00:00:00 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: msgpack
16
+ prerelease: false
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - &id002
20
+ - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
23
+ type: :runtime
24
+ version_requirements: *id001
25
+ description: " Pure Ruby client implementation of the Arachni-RPC protocol.\n"
26
+ email: tasos.laskos@arachni-scanner.com
34
27
  executables: []
28
+
35
29
  extensions: []
36
- extra_rdoc_files:
30
+
31
+ extra_rdoc_files:
37
32
  - README.md
38
33
  - LICENSE.md
39
34
  - CHANGELOG.md
40
- files:
35
+ files:
36
+ - CHANGELOG.md
37
+ - LICENSE.md
41
38
  - README.md
42
39
  - Rakefile
43
- - LICENSE.md
44
- - CHANGELOG.md
45
- - lib/arachni/rpc/pure/version.rb
40
+ - examples/client.rb
41
+ - lib/arachni/rpc/pure.rb
46
42
  - lib/arachni/rpc/pure/client.rb
47
43
  - lib/arachni/rpc/pure/connection.rb
48
- - lib/arachni/rpc/pure.rb
49
- - examples/client.rb
50
- - spec/pems/cacert.pem
51
- - spec/pems/client/foo-cert.pem
52
- - spec/pems/client/foo-key.pem
53
- - spec/pems/client/key.pem
54
- - spec/pems/client/cert.pem
55
- - spec/arachni/rpc/pure/client_spec.rb
56
- - spec/spec.opts
57
- - spec/spec_helper.rb
44
+ - lib/arachni/rpc/pure/version.rb
58
45
  homepage: https://github.com/Arachni/arachni-rpc-pure
59
46
  licenses: []
47
+
48
+ metadata: {}
49
+
60
50
  post_install_message:
61
- rdoc_options:
51
+ rdoc_options:
62
52
  - --charset=UTF-8
63
- require_paths:
53
+ require_paths:
64
54
  - lib
65
- required_ruby_version: !ruby/object:Gem::Requirement
66
- none: false
67
- requirements:
68
- - - ! '>='
69
- - !ruby/object:Gem::Version
70
- version: '0'
71
- required_rubygems_version: !ruby/object:Gem::Requirement
72
- none: false
73
- requirements:
74
- - - ! '>='
75
- - !ruby/object:Gem::Version
76
- version: '0'
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - *id002
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - *id002
77
61
  requirements: []
62
+
78
63
  rubyforge_project:
79
- rubygems_version: 1.8.24
64
+ rubygems_version: 2.2.2
80
65
  signing_key:
81
- specification_version: 3
66
+ specification_version: 4
82
67
  summary: Pure Ruby client for Arachni-RPC.
83
- test_files:
68
+ test_files:
84
69
  - examples/client.rb
85
- - spec/pems/cacert.pem
86
- - spec/pems/client/foo-cert.pem
87
- - spec/pems/client/foo-key.pem
88
- - spec/pems/client/key.pem
89
- - spec/pems/client/cert.pem
90
- - spec/arachni/rpc/pure/client_spec.rb
91
- - spec/spec.opts
92
- - spec/spec_helper.rb
70
+ has_rdoc:
@@ -1,119 +0,0 @@
1
- require File.join( File.expand_path( File.dirname( __FILE__ ) ), '../../../', 'spec_helper' )
2
-
3
- describe Arachni::RPC::Pure::Client do
4
-
5
- before( :all ) do
6
- @arg = [
7
- 'one',
8
- 2,
9
- { :three => 3 },
10
- [ 4 ]
11
- ]
12
- end
13
-
14
- describe "raw interface" do
15
-
16
- it "should be able to perform calls" do
17
- @arg.should == start_client( rpc_opts ).call( 'test.foo', @arg )
18
- end
19
-
20
- end
21
-
22
- describe "Arachni::RPC::RemoteObjectMapper interface" do
23
-
24
- it "should be able to properly forward calls" do
25
- test = Arachni::RPC::RemoteObjectMapper.new( start_client( rpc_opts ), 'test' )
26
- test.foo( @arg ).should == @arg
27
- end
28
-
29
- end
30
-
31
- describe "exception" do
32
-
33
- it "should be raised when requesting inexistent objects" do
34
- begin
35
- start_client( rpc_opts ).call( 'bar2.foo' )
36
- rescue Exception => e
37
- e.rpc_invalid_object_error?.should be_true
38
- end
39
- end
40
-
41
- it "should be raised when requesting inexistent or non-public methods" do
42
- begin
43
- start_client( rpc_opts ).call( 'test.bar2' )
44
- rescue Exception => e
45
- e.rpc_invalid_method_error?.should be_true
46
- end
47
-
48
- end
49
-
50
- it "should be raised when there's a remote exception" do
51
- begin
52
- start_client( rpc_opts ).call( 'test.foo' )
53
- rescue Exception => e
54
- e.rpc_remote_exception?.should be_true
55
- end
56
- end
57
-
58
- end
59
-
60
- it "should be able to retain stability and consistency under heavy load" do
61
- client = start_client( rpc_opts )
62
-
63
- n = 1000
64
- cnt = 0
65
-
66
- mismatches = []
67
-
68
- n.times {
69
- |i|
70
- client.call( 'test.foo', i ) {
71
- |res|
72
-
73
- cnt += 1
74
-
75
- mismatches << [i, res] if i != res
76
- break if cnt == n || !mismatches.empty?
77
- }
78
- }
79
-
80
- mismatches.should be_empty
81
- end
82
-
83
- it "should throw error when connecting to inexistent server" do
84
- begin
85
- start_client( rpc_opts.merge( :port => 9999 ) ).call( 'test.foo', @arg )
86
- rescue Exception => e
87
- e.rpc_connection_error?.should be_true
88
- end
89
- end
90
-
91
- context "when using valid SSL primitives" do
92
- it "should be able to establish a connection" do
93
- res = start_client( rpc_opts_with_ssl_primitives ).call( 'test.foo', @arg )
94
- res.should == @arg
95
- end
96
- end
97
-
98
- context "when using invalid SSL primitives" do
99
- it "should not be able to establish a connection" do
100
- begin
101
- start_client( rpc_opts_with_invalid_ssl_primitives ).call( 'test.foo', @arg )
102
- rescue Exception => e
103
- e.rpc_connection_error?.should be_true
104
- end
105
- end
106
- end
107
-
108
- context "when using mixed SSL primitives" do
109
- it "should not be able to establish a connection" do
110
- begin
111
- start_client( rpc_opts_with_mixed_ssl_primitives ).call( 'test.foo', @arg )
112
- rescue Exception => e
113
- e.rpc_connection_error?.should be_true
114
- e.rpc_ssl_error?.should be_true
115
- end
116
- end
117
- end
118
-
119
- end
@@ -1,37 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIGaDCCBFCgAwIBAgIJAPBYwqAog9f1MA0GCSqGSIb3DQEBBQUAMFMxCzAJBgNV
3
- BAYTAkdSMRgwFgYDVQQDEw9BcmFjaG5pLXRlc3QtQ0ExKjAoBgkqhkiG9w0BCQEW
4
- G2FyYWNobmlAYXJhY2huaS1zY2FubmVyLmNvbTAeFw0xMjExMDIxMDIyNTNaFw0y
5
- MjEwMzExMDIyNTNaMFMxCzAJBgNVBAYTAkdSMRgwFgYDVQQDEw9BcmFjaG5pLXRl
6
- c3QtQ0ExKjAoBgkqhkiG9w0BCQEWG2FyYWNobmlAYXJhY2huaS1zY2FubmVyLmNv
7
- bTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANHbVRqyD7FT8KSCZLm1
8
- YrOwMj78OXRjMb+ucPR+fncXR1TEuPlEFojLtzqtsaA5OJXpj+0toFP+2T4DeFlu
9
- YT4TBrRQ3DxmeY2b5b6ZuurLMfMc1vU+dE92Tj4nuInBz3Z09aDQ8ZWXWzJ7uD3J
10
- eNjOcj7Jc94AGFx05Tii9VriUmX+jXQALv5S5WGVtKt4p67mLm/2xD4JhS+a0+B8
11
- s/Xo7l6EXaFeTsH5jgZDiY+f0Dpk6cM+pZ5AJVJiNonDJs8/nl9vdWPRH40GHsyN
12
- H0/lo/wTxuth/TvX3DBB5hTi/9V5eYbLTLtE1oyXgBxNKrjDu8FVn/jUl8DAIdJL
13
- n4vXwXI70wLyS6aF8uu9ApNnmSbTTc2scAKDmnlINLHqGGlpyleojqphDy3MfQYk
14
- YT9QSXNKHlO4NMLFqrqM1F3hvM3MEteeM12gAeeJLY6YYYJafMMMh/e7kK/y5u+J
15
- ype5t5N8GKskSRp0RvlRYfoH/lnyJd6FEyh9P0QHA4CKAadZBCfOcmwmTY/G0Kjn
16
- 3Y7r7BmJb4PIEcDqUjXwuyq6ZHjx7sawuGG6eXhIGln0JtSymy4j+h+xlh0S7O8B
17
- Ti6dMVxg+DNTkEJz2O00IIBcyToqZ26XovFkN5ueRNOROB3YVpldmpbLyuOQae/D
18
- 4Gc21bEWoR7OAaY2PRl4r563AgMBAAGjggE9MIIBOTAdBgNVHQ4EFgQU8VOtNUbZ
19
- rnbX0gRWIds5yaT+uCwwgYMGA1UdIwR8MHqAFPFTrTVG2a5219IEViHbOcmk/rgs
20
- oVekVTBTMQswCQYDVQQGEwJHUjEYMBYGA1UEAxMPQXJhY2huaS10ZXN0LUNBMSow
21
- KAYJKoZIhvcNAQkBFhthcmFjaG5pQGFyYWNobmktc2Nhbm5lci5jb22CCQDwWMKg
22
- KIPX9TAPBgNVHRMBAf8EBTADAQH/MBEGCWCGSAGG+EIBAQQEAwIBBjAJBgNVHRIE
23
- AjAAMCsGCWCGSAGG+EIBDQQeFhxUaW55Q0EgR2VuZXJhdGVkIENlcnRpZmljYXRl
24
- MCYGA1UdEQQfMB2BG2FyYWNobmlAYXJhY2huaS1zY2FubmVyLmNvbTAOBgNVHQ8B
25
- Af8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggIBAAAAebhmNydIUT+sZpvWM5JKNQdq
26
- YtnghnpZyM37cxLmFIeDKKPTw/3lhDViRRqQaaFTI7ukcqgloPmhMuymQT4o11Fw
27
- XLoQuIeSgS7Mg6eZF3CUKoEy1KnlluegDXtDI+WH/EQHlokBvoMaClltj6vsfqI/
28
- K9K2MAXUKi8K7NRq6VYO1QPtrBfrX9VmLyndbYm8lSG5oDkGGh8NjVgHHZDgrQAQ
29
- 2EmsWbE9yMZ6yl+AaaE5XrbPWnBI8rK77WP93JYVAhmcaQiJzPfMw3sb2QojKdak
30
- 7fvJzAjBeXAoTP5Mu/E+BPPgELzB/DnRaWlrYsAQeRZBV+I3+k5CCVqdOAdJCk5Y
31
- dFNTppHfwVaDj5qKOmodzdUDcDL6ynl15t6WHgj2yBwsDVpWsvbqyitZkemLFwrf
32
- hAedR3dKr+IxrOynST1w4LorDorcGK/DqhD475bQ9EDel5nW18hotUeeeO+K3qc7
33
- iGgj7zTKfmhzL/KMotir/SQYYxQbbtLkkhXDaNVlWiYkHotOzrNbpKAFM776CI47
34
- KTXG88FydcycGHYU8SQLEbEDiowAikr2u+CUHKrJvz2Wr8jkWaMCSfgCyokcY6vR
35
- IIqnrpYHhX2FmKf+tRB8o3KXM6uiOSUvaW23LHcs0OKqcJ0XHOkhTMDFZ82eDZzl
36
- CXJQkVNhmc0Y9prF
37
- -----END CERTIFICATE-----
@@ -1,37 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIGazCCBFOgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBTMQswCQYDVQQGEwJHUjEY
3
- MBYGA1UEAxMPQXJhY2huaS10ZXN0LUNBMSowKAYJKoZIhvcNAQkBFhthcmFjaG5p
4
- QGFyYWNobmktc2Nhbm5lci5jb20wHhcNMTIxMTAyMTAyNDA4WhcNMjIxMDMwMTAy
5
- NDA4WjBKMQswCQYDVQQGEwJHUjEPMA0GA1UEAxMGQ2xpZW50MSowKAYJKoZIhvcN
6
- AQkBFhthcmFjaG5pQGFyYWNobmktc2Nhbm5lci5jb20wggIiMA0GCSqGSIb3DQEB
7
- AQUAA4ICDwAwggIKAoICAQDEl91flpFH2Y1b2voSsjYDEiC70ArJWrmgm/UFdtXT
8
- pCng9ACjJWuf/evBOa8SKmNFgM1NKMF7GaZghDid3npq4Pdz/C74Ci8Q3ORMPC25
9
- Cq5T8oLYr7OGRQG7cmAqq7fP7MbPikEoaV3sg9CYdCqeK5WqT4+2eWvJGZ6t3z/g
10
- A1WYoHMbhXS1MedPlJIboSUcUlvf2BEld4EzwjCAlF7IICAT37ijtlDqVZpByfii
11
- xj47wP/fx7AtHe7tog9h1MgM0ciJgvH9TT3Kc/iSHYwrhS6jcnlwju7P1YkaRjjO
12
- ODIt7HCf6ScMmK+XIJZRuI7I4zWSSUKI5vgj5BKtlyj71xHRcKX+wfUwhz92BwwE
13
- 9kakl+0L4C11aWKHsYpT8J3NFH8soFpyUPmVQTDiNDcmbxQYHuZbSdWG5+XLYrLZ
14
- MJ8am9HB7Z9uQugyZxki/AgQyT21eCJBrg83A0zd+SYezsDA/SVEZXCCrrO5/u/f
15
- 6+RGYZcWXaIk+18uai5ax0HwksN9AnIIYyH19Fkq516a231Hy37/RKn2W/vH7A/J
16
- YdleDe1wqeIApDC/jJncuO380BdzvvwbhTkp3KKjNcx0B9d917q+pguzotiVR19n
17
- /MyIZ2/EU6r+AGyt1jxFZQhbgL6ayVlMgflyCTcsfgN7kC6dW+7L5gfBt3MwoXgK
18
- lwIDAQABo4IBUTCCAU0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBLAwKwYJ
19
- YIZIAYb4QgENBB4WHFRpbnlDQSBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0O
20
- BBYEFNDF0OQgaYJqWYB9onMoDJrI6sEHMIGDBgNVHSMEfDB6gBTxU601RtmudtfS
21
- BFYh2znJpP64LKFXpFUwUzELMAkGA1UEBhMCR1IxGDAWBgNVBAMTD0FyYWNobmkt
22
- dGVzdC1DQTEqMCgGCSqGSIb3DQEJARYbYXJhY2huaUBhcmFjaG5pLXNjYW5uZXIu
23
- Y29tggkA8FjCoCiD1/UwJgYDVR0SBB8wHYEbYXJhY2huaUBhcmFjaG5pLXNjYW5u
24
- ZXIuY29tMCYGA1UdEQQfMB2BG2FyYWNobmlAYXJhY2huaS1zY2FubmVyLmNvbTAL
25
- BgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQEFBQADggIBAKOrRHhird4fhaVMHyNdTqQx
26
- tMuqYWrPb+L4vir7Gu9bfNXlS/b5QBBeFbg5YwVeMx2KTdJR9u3XK9PaQQCC0+ak
27
- tDy3beasiFvoThWmzaVLnPR2OpdRbbK9oFZuK7Y7Sdj6hFapbPcS3hG1M7uWtmiF
28
- Cwd3hmXzvyOH7DToQ5wRAtS3kE2I5J9kH8OVP/pIZ/OTnfDTHOilznOMmlJ+LuFh
29
- ECgxIFv9GRAb+J+AxFWBFNgm6yv6cGjAnT2rZR2B2WyKpmHs+mIxqmNSYldublKi
30
- OBVl13M2ETH9NKRkvNjYbD4nsZGWO85zGiv0AVaZxwEfIHuXQdWfSIhxno3UQpxJ
31
- UlCZTpGJ0wvHHrHC7GQZCCdr83Zq8MgcMgCuE78qNbYIE+rf6+MOhnxgg0sJ12Yr
32
- +++VrQx5HDOoChr39rFISRpi2vFxz5QsJONoNLvH0uJoxQ5UDlOXqeq6TlJBBNUk
33
- 77IkxGfqU7XmF9uT8nmcU4hx8yhKFJOZ5ORHX+U8+yaQN8RsxQadF7OzS1MMQXkl
34
- UwIeFEQNNv0JOIkjZILIDHz++PL5Fa+5/lgAV24X68ZIQ5FkgoLoOIWgbcARlsj0
35
- 62BJLPhrIbCUI7XDos+hTmMPWkzfGoIahL1mEMshlrKK/XGIFh9l1iKnI/4ze1bH
36
- 9nvAl0/txVluZtYXlf2E
37
- -----END CERTIFICATE-----
@@ -1,39 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIGzjCCBLagAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJGTzEM
3
- MAoGA1UECBMDZm9vMQwwCgYDVQQHEwNmb28xDDAKBgNVBAoTA2ZvbzEMMAoGA1UE
4
- CxMDZm9vMQwwCgYDVQQDEwNmb28xGjAYBgkqhkiG9w0BCQEWC2Zvb0Bmb28uZm9v
5
- MB4XDTExMDkyNjE0MDEzM1oXDTEyMDkyNTE0MDEzM1owgYMxCzAJBgNVBAYTAkZP
6
- MQwwCgYDVQQIEwNmb28xDDAKBgNVBAcTA2ZvbzEMMAoGA1UEChMDZm9vMQwwCgYD
7
- VQQLEwNmb28xETAPBgNVBAMTCHNvbWVuYW1lMSkwJwYJKoZIhvcNAQkBFhpzb21l
8
- bmFtZUBzb21lbmFtZS5zb21lbmFtZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
9
- AgoCggIBAL0r5N/tveIx+Mvuwx5R1rFuK6I8udjkzj7N5zFs/JNsHA/9pVfEX6Y4
10
- NPlER/0MvPUNfX6quuAN3IdEW1g7ond/fuI4iARY/TSgPipIn6jk4v6Y2A6nOmUp
11
- O/32JWZBcM3IF0qMFGfYOq5+D20iWc4l/wPkcHz46/x8Qx3bnncXJix2M/AS9RwN
12
- Kt26Ue5tG8sPY/ckMsvMbfMQ+R+15k1x6RAnBIHeh8QsFlDFBGT+EmKzDgCI41zN
13
- akKiS+ZvJy2byKYT/r0P47Rzx6YP52+rIVh1SlkWwjD6EbVcnvDcW52rDrcqtsSg
14
- uqiZfr+2Td+iOQBtUS2Y5htcjdipRaVLLoCY0qwX6i4JKGiL6fPVTgIUReZPFdk7
15
- CHVCVAAEDl3yGLe6wpqGonKk6JjBZByiW3EE9T8f3uxS3pxD6BitpVCzwYiAJnFr
16
- DvV0xNBLriSJ+Ebcc7f0ng+L7CPO9C8ILX+vIfToURhrup4+vn7W4pyft3b588O2
17
- XBcax+XyBn1aQN6pwZrT/9wv85J94A/WBYkOvPl3Rv2uwjlzwfR/owLVPJkbowgF
18
- iUGQz9vl/0C+KcWkyjnXKXxq2EK7kszBH5m3vgDz2j3mMBGv0xfTZmDVM+Qs12xv
19
- wMwIfsOxo1oMmI6mWSx3NsJqP89ui650WAqORsWZ6O0jVv64tlnXAgMBAAGjggFe
20
- MIIBWjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIEsDArBglghkgBhvhCAQ0E
21
- HhYcVGlueUNBIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUililQx5n
22
- hJGu4Zx3C8kDJEU08ogwgaEGA1UdIwSBmTCBloAUX93JoFY2qeY+HVPZ+jAIbA/Y
23
- rkGhc6RxMG8xCzAJBgNVBAYTAkZPMQwwCgYDVQQIEwNmb28xDDAKBgNVBAcTA2Zv
24
- bzEMMAoGA1UEChMDZm9vMQwwCgYDVQQLEwNmb28xDDAKBgNVBAMTA2ZvbzEaMBgG
25
- CSqGSIb3DQEJARYLZm9vQGZvby5mb2+CCQCmSX0QNZkjADAWBgNVHRIEDzANgQtm
26
- b29AZm9vLmZvbzAlBgNVHREEHjAcgRpzb21lbmFtZUBzb21lbmFtZS5zb21lbmFt
27
- ZTALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQEFBQADggIBAFlzE1hgfZ6Zhl8RpckD
28
- 0NDEZFAij+gQl91gcgAnkOE70JxbBiW3LXtdQvdNNpOUUdi10+UtbRyM1XayS7tQ
29
- v/yHvfTINtMXazDQiG+ClcCSapjAFhMJhA7HWMtZLtzXb/Pox2JciGdilbyPeHTb
30
- xitlun85TuTSseOkriND8OnjFolOBb/713adKE/p/UEbqZ9vbMyMgxOgemdPKKSB
31
- H8k/mdQtMbcK7Q01Z/3UMDyxiVoQk2x8SqG4NxKKTRhKN4U8DKCGO8b4awgQo+je
32
- mc01hW60ScVhBR+ha8NkvmReUm/pvIrYdaHnyJxwlY+RjIn2Y3OBlvBHkOVBCTJo
33
- MVHqVQGksEQH/U+zlcWrv8H/1JOhdnq4lXnWkFvOBRUVSXF3vw9q4aMYMB1bagAU
34
- ykciVW367xwj0HMzfAKT09uo0BhyqUuLec4/ksOeDGxLRn5KdrVwAp6b+quBHbkx
35
- BCGdLvBVxgx11E+YV+WbY0pvNNdqpsKq9oZxOLnTQek8YJ317WSzUeUPOT5zu4sM
36
- /B/i43wDiFWV1EcV8gEAy72l7jXi3++JbN56Cd03DML/BxSmfWXwrT3hKDP9mG5+
37
- X4N8iCT+NBIMDYX1EAiBfD7ioxDpIv5yu+WNhTH7qsDPAE0Q3aTd1Un1Lkn7F/51
38
- bKDKa/6PCJlZOkZGTU7wxaCy
39
- -----END CERTIFICATE-----
@@ -1,51 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- AQKCAgAtE0h2EzArtbyS21Gi591Aaf/7qHygMeTzEh0EqfOFLT2Cke3T+/bOpJX6
14
- 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
- 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
- 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
- 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
- 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
- 313rZ1Yh9clgXSuVw4yxGnHTGtYT8v5pwynk55goZxzqLICHwl0UzjG2fQxmhWq7
20
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- vu3+f2KGqUFYWVSmzeHNxKVYspUMWhCTfLKPL5mt18iJyNcyRXi8NGTCeJT1jELc
29
- +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
- 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
- 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
- 2vJcj28559CwDmB0KkOk/bqSSnsZnCc4sv2y+4Whe6Kirz0Dom8tmS82pc66dRW4
33
- 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
- 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
- ++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
- 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
- WqvyM9e9qN4OGH4VuD9OoQi0e09eApgl7u7g8vnwJQXjMnSt+pt2RWK+LQmPK1DF
38
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- xt7TXHx+/wDTvZtw8ImTQ6onQoV4LpMfAoIBAGqZ9HyADbomllKHw+Ks5oL66EYk
46
- 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
- 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
- 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
- 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
- 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
51
- -----END RSA PRIVATE KEY-----
@@ -1,51 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- ptp9+ol94wKxR5ukfNtqi8A12pHGm2iVpqyBSL+GE3YEB9JpukmkaVgOSTNi1pTr
18
- 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
- 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
- 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
- hcww9sRlCdp+jiNXUbmJcBiU0CLVoJmjmigAje5NmKDG5oM+puhW5G2oHVHtmL5D
22
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- aAEnrnH12wjBh+CcToxSY8BVzECYYeic4TE99IqzUqBDhvFjfgM8n9NmebFZ/6pB
45
- +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
- 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
- +Hrn4ckeUId+NlKfxxdc5bISARP9vV/jdlJ37QOtm7LlLdhHw97Y8tN24E+N6gN0
48
- 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
- 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
- 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
51
- -----END RSA PRIVATE KEY-----
@@ -1,2 +0,0 @@
1
- --color
2
- --backtrace
@@ -1,42 +0,0 @@
1
- def cwd
2
- File.expand_path( File.dirname( __FILE__ ) )
3
- end
4
-
5
- require File.join( cwd, '../lib/arachni/rpc/', 'pure' )
6
-
7
- def rpc_opts
8
- {
9
- :host => 'localhost',
10
- :port => 7331,
11
- :token => 'superdupersecret',
12
- :serializer => Marshal,
13
- }
14
- end
15
-
16
- def rpc_opts_with_ssl_primitives
17
- rpc_opts.merge(
18
- :port => 7332,
19
- :ssl_ca => cwd + '/pems/cacert.pem',
20
- :ssl_pkey => cwd + '/pems/client/key.pem',
21
- :ssl_cert => cwd + '/pems/client/cert.pem'
22
- )
23
- end
24
-
25
- def rpc_opts_with_invalid_ssl_primitives
26
- rpc_opts_with_ssl_primitives.merge(
27
- :ssl_pkey => cwd + '/pems/client/foo-key.pem',
28
- :ssl_cert => cwd + '/pems/client/foo-cert.pem'
29
- )
30
- end
31
-
32
- def rpc_opts_with_mixed_ssl_primitives
33
- rpc_opts_with_ssl_primitives.merge(
34
- :ssl_pkey => cwd + '/pems/client/key.pem',
35
- :ssl_cert => cwd + '/pems/client/foo-cert.pem'
36
- )
37
- end
38
-
39
-
40
- def start_client( opts )
41
- Arachni::RPC::Pure::Client.new( opts )
42
- end