ji2p 0.0.3-java

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.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/bin/bundle +15 -0
  3. data/bin/ctxirb +119 -0
  4. data/bin/simple_http_server +20 -0
  5. data/bin/simple_outproxy +96 -0
  6. data/lib/actor_system/actor.rb +10 -0
  7. data/lib/actor_system/concurrent/processor.rb +21 -0
  8. data/lib/actor_system/concurrent/worker.rb +13 -0
  9. data/lib/actor_system/core/minimal.rb +84 -0
  10. data/lib/actor_system/core/observable_implementation.rb +58 -0
  11. data/lib/actor_system/core/props.rb +45 -0
  12. data/lib/actor_system/dispatcher.rb +12 -0
  13. data/lib/actor_system/mailbox.rb +7 -0
  14. data/lib/actor_system/message.rb +60 -0
  15. data/lib/core_ext.rb +41 -0
  16. data/lib/gen_server.rb +57 -0
  17. data/lib/ji2p.rb +37 -0
  18. data/lib/ji2p/bundler.rb +165 -0
  19. data/lib/ji2p/cluster.rb +6 -0
  20. data/lib/ji2p/cluster/etcd.rb +5 -0
  21. data/lib/ji2p/cluster/etcd/version3.rb +6 -0
  22. data/lib/ji2p/cluster/kubernetes.rb +5 -0
  23. data/lib/ji2p/cluster/kubernetes/kube_api.rb +6 -0
  24. data/lib/ji2p/concurrent.rb +24 -0
  25. data/lib/ji2p/concurrent_executor.rb +56 -0
  26. data/lib/ji2p/config.rb +15 -0
  27. data/lib/ji2p/control.rb +15 -0
  28. data/lib/ji2p/control/client_manager.rb +14 -0
  29. data/lib/ji2p/control/dest.rb +34 -0
  30. data/lib/ji2p/control/keypair.rb +176 -0
  31. data/lib/ji2p/control/server.rb +80 -0
  32. data/lib/ji2p/control/socket_manager.rb +77 -0
  33. data/lib/ji2p/control/tunnel_manager.rb +62 -0
  34. data/lib/ji2p/environment.rb +35 -0
  35. data/lib/ji2p/gem_installer.rb +89 -0
  36. data/lib/ji2p/jar_dependencies.rb +15 -0
  37. data/lib/ji2p/proxy_support.rb +46 -0
  38. data/lib/ji2p/rspec.rb +16 -0
  39. data/lib/ji2p/server.rb +10 -0
  40. data/lib/ji2p/server/api.rb +14 -0
  41. data/lib/ji2p/server/database.rb +66 -0
  42. data/lib/ji2p/server/http.rb +69 -0
  43. data/lib/ji2p/server/http_server.rb +37 -0
  44. data/lib/ji2p/server/initializer.rb +4 -0
  45. data/lib/ji2p/server/launcher.rb +40 -0
  46. data/lib/ji2p/server/models.rb +9 -0
  47. data/lib/ji2p/server/models/base_record.rb +7 -0
  48. data/lib/ji2p/server/models/keypair.rb +32 -0
  49. data/lib/ji2p/server/models/tunnel.rb +4 -0
  50. data/lib/ji2p/startup.rb +12 -0
  51. data/lib/ji2p/startup/bootstrap.rb +60 -0
  52. data/lib/ji2p/startup/client_application.rb +20 -0
  53. data/lib/ji2p/startup/router_manager.rb +21 -0
  54. data/lib/ji2p/startup/sinatra_app.rb +61 -0
  55. data/lib/ji2p/utils/blocking_queue.rb +32 -0
  56. data/lib/ji2p/version.rb +3 -0
  57. data/lib/ji2p_jars.rb +16 -0
  58. data/lib/maybe.rb +148 -0
  59. data/lib/net/i2p/client/mstreaming/0.9.43/mstreaming-0.9.43.jar +0 -0
  60. data/lib/net/i2p/client/streaming/0.9.43/streaming-0.9.43.jar +0 -0
  61. data/lib/net/i2p/i2p/0.9.43/i2p-0.9.43.jar +0 -0
  62. data/lib/net/i2p/router/0.9.43/router-0.9.43.jar +0 -0
  63. metadata +375 -0
@@ -0,0 +1,77 @@
1
+ require 'java'
2
+ require 'thread'
3
+ require_relative 'server.rb'
4
+
5
+ module Ji2p::Control
6
+ java_import 'net.i2p.I2PAppContext'
7
+ java_import 'net.i2p.client.I2PClientFactory'
8
+ java_import 'net.i2p.client.streaming.I2PSocketManager'
9
+ java_import 'net.i2p.client.streaming.I2PSocketManagerFactory'
10
+ java_import 'net.i2p.client.streaming.IncomingConnectionFilter'
11
+ java_import 'java.util.Properties'
12
+ java_import 'java.lang.Thread'
13
+
14
+ class SocketManager
15
+
16
+ def self.defineManager! name, kp, opts=Java::JavaUtil::Properties.new, filter=IncomingConnectionFilter::ALLOW
17
+ ctx = I2PAppContext.getGlobalContext
18
+ session = kp.createSession opts
19
+ new get_impl.new(ctx,session,opts,name,filter)
20
+ end
21
+
22
+ def connectTunnel
23
+ @smgr.getSession.connect
24
+ end
25
+
26
+ def myDestination
27
+ @smgr.getSession.myDestination
28
+ end
29
+
30
+ def leaseSet
31
+ @smgr.getSession.leaseSet
32
+ end
33
+
34
+ def sessionId
35
+ @smgr.getSession.sessionId
36
+ end
37
+
38
+ def supports_ls2?
39
+ @smgr.getSession.supports_ls2?
40
+ end
41
+
42
+ def is_closed?
43
+ @smgr.getSession.closed?
44
+ end
45
+
46
+ def session
47
+ @smgr.session
48
+ end
49
+
50
+ def destroy
51
+ @smgr.getSession.destroySession
52
+ end
53
+
54
+ def lookupDest dest
55
+ @smgr.getSession.lookupDest dest
56
+ end
57
+
58
+ def getServerSocket
59
+ SocketServer.new @smgr.getServerSocket
60
+ end
61
+
62
+ def raw
63
+ @smgr
64
+ end
65
+
66
+ private
67
+
68
+ def self.get_impl
69
+ java_import('net.i2p.client.streaming.impl.I2PSocketManagerFull').first
70
+ end
71
+
72
+ def initialize smgr
73
+ @smgr = smgr
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,62 @@
1
+ require 'java'
2
+
3
+ require 'java'
4
+ require 'digest/sha1'
5
+
6
+ module Ji2p::Control
7
+ class TunnelManager
8
+ @@tunnelctrl = nil
9
+ include_package 'net.i2p'
10
+ include_package 'net.i2p.i2ptunnel'
11
+ include_package 'net.i2p.client'
12
+
13
+ def self.context
14
+ I2PAppContext.getGlobalContext
15
+ end
16
+
17
+ def self.startTunnelWithConfig conf, createPrivKey = false
18
+ unless ['client','httpclient','server','httpserver','sockstunnel'].include? conf['type']
19
+ raise ArgumentError, 'Invalid i2p tunnel type!', caller
20
+ end
21
+ tctrl = TunnelController.new conf, '', createPrivKey
22
+ TunnelCtrl.new tctrl, conf
23
+ end
24
+
25
+ def self.createNewConfig hash = Hash.new
26
+ props = java.util.Properties.new
27
+ dfl = {
28
+ 'option.maxPosts'=>'3',
29
+ 'option.i2cp.destination.sigType'=>'EdDSA_SHA512_Ed25519',
30
+ 'option.i2p.streaming.limitAction'=>'http',
31
+ 'description'=>'jruby-tunnel',
32
+ 'interface'=>'127.0.0.1',
33
+ 'type'=>'httpserver',
34
+ 'option.outbound.quantity'=>'4',
35
+ 'option.inbound.quantity'=>'4',
36
+ 'option.postBanTime'=>'1800',
37
+ 'targetPort'=>'8000',
38
+ 'option.postTotalBanTime'=>'600',
39
+ 'i2cpHost'=>'127.0.0.1',
40
+ 'option.postCheckTime'=>'300',
41
+ 'option.i2p.streaming.maxConnsPerHour'=>'40',
42
+ 'option.shouldBundleReplyInfo'=>'false',
43
+ 'option.outbound.length'=>'1',
44
+ 'targetHost'=>'127.0.0.1',
45
+ 'option.inbound.length'=>'1',
46
+ 'i2cpPort'=>'7654',
47
+ 'persistentClientKey'=>'true',
48
+ 'option.maxTotalPosts'=>'10',
49
+ 'option.i2p.streaming.maxConnsPerDay'=>'100',
50
+ 'option.i2p.streaming.maxTotalConnsPerMinute'=>'25',
51
+ 'option.i2p.streaming.maxConnsPerMinute'=>'15',
52
+ 'name'=>'jruby-tunnel',
53
+ 'option.i2p.streaming.maxConcurrentStreams'=>'20',
54
+ 'privKeyFile'=>'kake.dat',
55
+ 'listenPort'=>'8000'
56
+ }
57
+ merged = dfl.merge(hash)
58
+ merged.keys.each { |k| props[k.to_s] = merged[k].to_s }
59
+ props
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,35 @@
1
+ require 'pathname'
2
+
3
+ module Ji2p
4
+ module Environment
5
+ extend self
6
+ JI2P_HOME = ::File.expand_path(::File.join('..','..'), __dir__) unless defined? JI2P_HOME
7
+
8
+ BUNDLE_DIR = ::File.join(JI2P_HOME, "vendor", "bundle") unless defined? BUNDLE_DIR
9
+ GEMFILE_PATH = ::File.join(JI2P_HOME, "Gemfile") unless defined? GEMFILE_PATH
10
+ LOCAL_GEM_PATH = ::File.join(JI2P_HOME, 'vendor', 'local_gems') unless defined? LOCAL_GEM_PATH
11
+ CACHE_PATH = ::File.join(JI2P_HOME, "vendor", "cache") unless defined? CACHE_PATH
12
+ LOCKFILE = Pathname.new(::File.join(JI2P_HOME, "Gemfile.lock")) unless defined? LOCKFILE
13
+ GEMFILE = Pathname.new(::File.join(JI2P_HOME, "Gemfile")) unless defined? GEMFILE
14
+
15
+ def gem_ruby_version
16
+ RbConfig::CONFIG["ruby_version"]
17
+ end
18
+
19
+ def ruby_abi_version
20
+ RUBY_VERSION[/(\d+\.\d+)(\.\d+)*/, 1]
21
+ end
22
+
23
+ def ruby_engine
24
+ RUBY_ENGINE
25
+ end
26
+
27
+ def ji2p_gem_home
28
+ ::File.join(BUNDLE_DIR, ruby_engine, gem_ruby_version)
29
+ end
30
+
31
+ def vendor_path(path)
32
+ return ::File.join(JI2P_HOME, "vendor", path)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,89 @@
1
+
2
+ require "pathname"
3
+ require "rubygems/package"
4
+ require "fileutils"
5
+
6
+ require_relative 'environment.rb'
7
+
8
+ module Ji2p
9
+ class GemInstaller
10
+ GEM_HOME = Pathname.new(::File.join(Ji2p::Environment::BUNDLE_DIR, "jruby", "2.5.0"))
11
+ SPECIFICATIONS_DIR = "specifications"
12
+ GEMS_DIR = "gems"
13
+ CACHE_DIR = "cache"
14
+
15
+ attr_reader :gem_home
16
+
17
+ def initialize(gem_file, display_post_install_message = false, gem_home = GEM_HOME)
18
+ @gem_file = gem_file
19
+ @gem = ::Gem::Package.new(@gem_file)
20
+ @gem_home = Pathname.new(gem_home)
21
+ @display_post_install_message = display_post_install_message
22
+ end
23
+
24
+ def install
25
+ create_destination_folders
26
+ extract_files
27
+ write_specification
28
+ copy_gem_file_to_cache
29
+ post_install_message
30
+ end
31
+
32
+ def self.install(gem_file, display_post_install_message = false, gem_home = GEM_HOME)
33
+ self.new(gem_file, display_post_install_message, gem_home).install
34
+ end
35
+
36
+ private
37
+ def spec
38
+ @gem.spec
39
+ end
40
+
41
+ def spec_dir
42
+ gem_home.join(SPECIFICATIONS_DIR)
43
+ end
44
+
45
+ def cache_dir
46
+ gem_home.join(CACHE_DIR)
47
+ end
48
+
49
+ def spec_file
50
+ spec_dir.join("#{spec.full_name}.gemspec")
51
+ end
52
+
53
+ def gem_dir
54
+ gem_home.join(GEMS_DIR, spec.full_name)
55
+ end
56
+
57
+ def extract_files
58
+ @gem.extract_files gem_dir
59
+ end
60
+
61
+ def write_specification
62
+ ::File.open(spec_file, 'w') do |file|
63
+ spec.installed_by_version = ::Gem.rubygems_version
64
+ file.puts spec.to_ruby_for_cache
65
+ file.fsync rescue nil # Force writing to disk
66
+ end
67
+ end
68
+
69
+ def post_install_message
70
+ spec.post_install_message if display_post_install_message?
71
+ end
72
+
73
+ def display_post_install_message?
74
+ @display_post_install_message && !spec.post_install_message.nil?
75
+ end
76
+
77
+ def copy_gem_file_to_cache
78
+ destination = ::File.join(cache_dir, ::File.basename(@gem_file))
79
+ FileUtils.cp(@gem_file, destination)
80
+ end
81
+
82
+ def create_destination_folders
83
+ FileUtils.mkdir_p(gem_home)
84
+ FileUtils.mkdir_p(gem_dir)
85
+ FileUtils.mkdir_p(spec_dir)
86
+ FileUtils.mkdir_p(cache_dir)
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,15 @@
1
+ require "jar_dependencies"
2
+
3
+ def require_jar( *args )
4
+ return nil unless Jars.require?
5
+ result = Jars.require_jar( *args )
6
+ if result.is_a? String
7
+ # JAR_DEBUG=1 will now show theses
8
+ Jars.debug { "--- jar coordinate #{args[0..-2].join( ':' )} already loaded with version #{result} - omit version #{args[-1]}" }
9
+ Jars.debug { " try to load from #{caller.join("\n\t")}" }
10
+ return false
11
+ end
12
+ Jars.debug { " register #{args.inspect} - #{result == true}" }
13
+ result
14
+ end
15
+
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ require "uri"
3
+ require "java"
4
+ require "erb"
5
+
6
+ module Ji2p
7
+ extend self
8
+
9
+ # Apply HTTP_PROXY and HTTPS_PROXY to the current environment
10
+ # this will be used by any JRUBY calls
11
+ def apply_env_proxy_settings(settings)
12
+ $stderr.puts("Using proxy #{settings}") if ENV["DEBUG"]
13
+ scheme = settings[:protocol].downcase
14
+ java.lang.System.setProperty("#{scheme}.proxyHost", settings[:host])
15
+ java.lang.System.setProperty("#{scheme}.proxyPort", settings[:port].to_s)
16
+ java.lang.System.setProperty("#{scheme}.proxyUsername", settings[:username].to_s)
17
+ java.lang.System.setProperty("#{scheme}.proxyPassword", settings[:password].to_s)
18
+ end
19
+
20
+ def extract_proxy_values_from_uri(proxy_uri)
21
+ {
22
+ :protocol => proxy_uri.scheme,
23
+ :host => proxy_uri.host,
24
+ :port => proxy_uri.port,
25
+ :username => proxy_uri.user,
26
+ :password => proxy_uri.password
27
+ }
28
+ end
29
+
30
+ def parse_proxy_string(proxy_string)
31
+ proxy_uri = URI.parse(proxy_string)
32
+ if proxy_uri.kind_of?(URI::HTTP) # URI::HTTPS is already a subclass of URI::HTTP
33
+ proxy_uri
34
+ else
35
+ raise "Invalid proxy `#{proxy_uri}`. The URI is not HTTP/HTTPS."
36
+ end
37
+ end
38
+
39
+ def get_proxy(key)
40
+ ENV[key.downcase] || ENV[key.upcase]
41
+ end
42
+
43
+ def proxy_string_exists?(proxy)
44
+ !proxy.nil? && !proxy.strip.empty?
45
+ end
46
+ end
data/lib/ji2p/rspec.rb ADDED
@@ -0,0 +1,16 @@
1
+ require_relative 'environment'
2
+ Ji2p::Bundler.setup!({:without => [:build]})
3
+ require 'ji2p'
4
+
5
+ $LOAD_PATH.unshift(File.join(Ji2p::Environment::JI2P_CORE, "spec"))
6
+
7
+ require 'rspec/core'
8
+ require 'rspec'
9
+
10
+ RSpec.world.reset # if multiple rspec runs occur in a single process, the RSpec "world" state needs to be reset.
11
+
12
+ status = RSpec::Core::Runner.run(ARGV.empty? ? ($JUNIT_ARGV || ["spec"]) : ARGV).to_i
13
+ if ENV["IS_JUNIT_RUN"]
14
+ return status
15
+ end
16
+ exit status if status != 0
@@ -0,0 +1,10 @@
1
+ module Ji2p
2
+ module Server
3
+ autoload :Api, File.expand_path('server/api.rb', __dir__)
4
+ autoload :Database, File.expand_path('server/database.rb', __dir__)
5
+ autoload :HTTP, File.expand_path('server/http.rb', __dir__)
6
+ autoload :HttpServer, File.expand_path('server/http_server.rb', __dir__)
7
+ autoload :Launcher, File.expand_path('server/launcher.rb', __dir__)
8
+ autoload :Models, File.expand_path('server/models.rb', __dir__)
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ require 'sinatra'
2
+ require 'rack'
3
+ require 'puma'
4
+
5
+ module Ji2p::Server
6
+ class Api
7
+ def initialize
8
+ configure { set :server, :puma }
9
+
10
+ #Faye::WebSocket.load_adapter('puma')
11
+ @puma = Rack::Handler.get('puma')
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,66 @@
1
+ require 'active_record'
2
+
3
+ module Ji2p::Server
4
+ module Database
5
+ @@connections = Hash.new
6
+ @@default_connection = nil
7
+
8
+ def self.connect! db=':memory:', db_type='sqlite3'
9
+ conn = ActiveRecord::Base.establish_connection(database: db, adapter: db_type)
10
+ key = "#{db}/#{db_type}/#{Ji2p::Control.unique_id.to_s}"
11
+ @@connections[key] = conn
12
+ @@default_connection = conn if @@default_connection.nil?
13
+ define_state_schema!
14
+ conn
15
+ end
16
+
17
+ def self.connect_with_local_path! name
18
+ java_import 'net.i2p.I2PAppContext'
19
+ ctx = Java::NetI2p::I2PAppContext.getGlobalContext
20
+ path = File.join ctx.getConfigDir.toString, name
21
+ connect! path
22
+ end
23
+
24
+ def self.flush
25
+ @@default_connection.flush
26
+ end
27
+
28
+ def self.default
29
+ @@default_connection
30
+ end
31
+
32
+ def self.is_connected?
33
+ get_connections.size > 0
34
+ end
35
+
36
+ def self.get_connections
37
+ @@connections
38
+ end
39
+
40
+ def self.define_state_schema! b_force=false
41
+ ActiveRecord::Schema.define do
42
+ create_table :keypairs, force: b_force do |t|
43
+ t.string :strid
44
+ t.string :name
45
+ t.text :destination
46
+ t.string :base32
47
+ t.text :private_key_data
48
+ t.json :metadata
49
+ t.timestamps
50
+ end unless ActiveRecord::Base.connection.table_exists? 'keypairs' or b_force
51
+ create_table :tunnels, force: b_force do |t|
52
+ t.string :name
53
+ t.text :description
54
+ t.json :metadata
55
+ t.references :keypair
56
+ t.string :tunnel_type
57
+ t.integer :listen_port
58
+ t.integer :target_port
59
+ t.string :listen_interface
60
+ t.string :target_host
61
+ t.timestamps
62
+ end unless ActiveRecord::Base.connection.table_exists? 'tunnels' or b_force
63
+ end
64
+ end
65
+ end
66
+ end