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,69 @@
1
+ require 'rack'
2
+
3
+ module Ji2p::Server
4
+ class HTTP
5
+ VERSION = "HTTP/1.1" unless defined? VERSION
6
+ CRLF = "\r\n" unless defined? CRLF
7
+
8
+ def initialize(socket, application)
9
+ @socket = socket
10
+ @application = application
11
+ end
12
+
13
+ def parse
14
+ matches = /\A(?<method>\S+)\s+(?<uri>\S+)\s+(?<version>\S+)#{CRLF}\Z/.match(@socket.readline)
15
+ uri = URI.parse(matches[:uri])
16
+
17
+ env = {
18
+ "rack.errors" => $stderr,
19
+ "rack.version" => Rack::VERSION,
20
+ "rack.url_scheme" => uri.scheme || "http",
21
+ "REQUEST_METHOD" => matches[:method],
22
+ "REQUEST_URI" => matches[:uri],
23
+ "HTTP_VERSION" => matches[:version],
24
+ "QUERY_STRING" => uri.query || "",
25
+ "SERVER_PORT" => uri.port || 80,
26
+ "SERVER_NAME" => uri.host || "localhost",
27
+ "PATH_INFO" => uri.path || "",
28
+ "SCRIPT_NAME" => "",
29
+ }
30
+
31
+ while matches = /\A(?<key>[^:]+):\s*(?<value>.+)#{CRLF}\Z/.match(hl = @socket.readline)
32
+ case matches[:key]
33
+ when Rack::ContentType then env["CONTENT_TYPE"] = matches[:value]
34
+ when Rack::ContentLength then env["CONTENT_LENGTH"] = Integer(matches[:value])
35
+ else env["HTTP_" + matches[:key].tr("-", "_").upcase] ||= matches[:value]
36
+ end
37
+ end
38
+
39
+ env["rack.input"] = StringIO.new(@socket.read(env["CONTENT_LENGTH"] || 0))
40
+
41
+ return env #.map { |_,v| String.new v }
42
+ end
43
+
44
+ def handle
45
+ env = parse
46
+
47
+ status, headers, body = @application.call(env)
48
+
49
+ time = Time.now.httpdate
50
+
51
+ @socket.write "#{env['HTTP_VERSION']} #{status} #{Rack::Utils::HTTP_STATUS_CODES.fetch(status.to_i) { 'UNKNOWN' }}#{CRLF}"
52
+ @socket.write "Date: #{time}#{CRLF}"
53
+ @socket.write "Connection: close#{CRLF}"
54
+
55
+ headers.each do |key, value|
56
+ @socket.write "#{key}: #{value}#{CRLF}"
57
+ end
58
+
59
+ @socket.write(CRLF)
60
+
61
+ body.each do |chunk|
62
+ @socket.write(chunk)
63
+ end
64
+
65
+ Ji2p.logger.info("[#{time}] '#{env["REQUEST_METHOD"]} #{env["REQUEST_URI"]} #{env["HTTP_VERSION"]}' #{status}")
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,37 @@
1
+ require_relative 'http.rb'
2
+
3
+ module Ji2p::Server
4
+ class HttpServer
5
+
6
+ def initialize(application, socket)
7
+ @application = application
8
+ @socket = socket
9
+ end
10
+
11
+ def run
12
+ loop do
13
+ begin
14
+ monitor
15
+ rescue Interrupt
16
+ Ji2p.logger.log("INTERRUPTED")
17
+ return
18
+ end
19
+ end
20
+ end
21
+
22
+ def monitor
23
+ #selections, = IO.select(@sockets)
24
+ #io, = selections
25
+ io = @socket
26
+
27
+ begin
28
+ socket = io.accept
29
+ http = Ji2p::Server::HTTP::new(socket, @application)
30
+ http.handle
31
+ ensure
32
+ socket.close
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,4 @@
1
+ module Ji2p::Server
2
+ module Initializer
3
+ end
4
+ end
@@ -0,0 +1,40 @@
1
+ require 'rack'
2
+
3
+ module Ji2p::Server
4
+ class Launcher
5
+
6
+ def initialize privateKeyData=nil
7
+ generate_keypair if privateKeyData.nil?
8
+ load_keypair privateKeyData unless privateKeyData.nil?
9
+ end
10
+
11
+ protected
12
+
13
+ def generate_keypair
14
+ @keypair = Ji2p::Control::Keypair.generate!
15
+ end
16
+
17
+ def load_keypair privateKeyData
18
+ @keypair = Ji2p::Control::Keypair.load_from_stream! StringIO.new(privateKeyData)
19
+ end
20
+
21
+ end
22
+
23
+ class RackConfigLauncher < Launcher
24
+
25
+ def initialize privateKeyData, rackfile
26
+ super(privateKeyData)
27
+ @rack_config = rackfile.dup
28
+ end
29
+
30
+ def rack_application
31
+ raw = File.read(@rack_config)
32
+ builder = <<~BUILDER
33
+ Rack::Builder.new do
34
+ #{raw}
35
+ end
36
+ BUILDER
37
+ eval(builder, nil, @rack_config)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,9 @@
1
+ require 'active_record'
2
+
3
+ module Ji2p::Server
4
+ module Models
5
+ autoload :BaseRecord, File.expand_path('models/base_record.rb', __dir__)
6
+ autoload :Keypair, File.expand_path('models/keypair.rb', __dir__)
7
+ autoload :Tunnel, File.expand_path('models/tunnel.rb', __dir__)
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ require 'active_record'
2
+
3
+ module Ji2p::Server::Models
4
+ class BaseRecord < ActiveRecord::Base
5
+ self.abstract_class = true
6
+ end
7
+ end
@@ -0,0 +1,32 @@
1
+ require 'active_record'
2
+ require 'base64'
3
+
4
+ module Ji2p::Server::Models
5
+ Ji2p::Control::Keypair.class_eval do
6
+ def to_activerecord
7
+ row = Ji2p::Server::Models::Keypair.new
8
+ row.destination = @dest.base64
9
+ row.base32 = @dest.base32
10
+ row.private_key_data = Base64.encode64(@data)
11
+ row
12
+ end
13
+
14
+ private
15
+
16
+ def write_dummy_stream obj
17
+ s = StringIO.new
18
+ obj.writeBytes(s.to_outputstream)
19
+ Base64.encode64 s.string
20
+ end
21
+ end
22
+ class Keypair < BaseRecord
23
+
24
+ def pk_data
25
+ Base64.decode64(private_key_data)
26
+ end
27
+
28
+ def getKeypairInstance
29
+ Ji2p::Control::Keypair.load_from_stream! StringIO.new(pk_data)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,4 @@
1
+ module Ji2p::Server::Models
2
+ class Tunnel < BaseRecord
3
+ end
4
+ end
@@ -0,0 +1,12 @@
1
+ module Ji2p
2
+ module Startup
3
+ autoload :Bootstrap, File.expand_path('startup/bootstrap.rb', __dir__)
4
+ autoload :RouterManager, File.expand_path('startup/router_manager.rb', __dir__)
5
+
6
+ TMPDIR = File.expand_path('../../tmp', __dir__) unless defined? TMPDIR
7
+
8
+ def self.tmp_dir
9
+ TMPDIR
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,60 @@
1
+ require 'java'
2
+
3
+ module Ji2p::Startup
4
+ java_import java.lang.ClassLoader
5
+ java_import java.lang.System
6
+
7
+ class Bootstrap
8
+ def initialize defaults={'i2p.dir.config' => TMPDIR}
9
+ @defaults = defaults
10
+ end
11
+
12
+ def set_system_property key, value
13
+ System.setProperty key.to_s, value.to_s
14
+ end
15
+
16
+ def get_system_property value
17
+ System.getProperty[value.to_s]
18
+ end
19
+
20
+ def load_jars
21
+ java_import java.lang.Thread
22
+ java_import java.net.URL
23
+ cl = Thread.currentThread.getContextClassLoader
24
+ dirname = System.getProperties['i2p.dir.base']
25
+ Dir["#{dirname}/lib/**.jar"].each do |jar|
26
+ u = Java::JavaNet::URL.new "file://#{jar}"
27
+ cl.addURL u
28
+ end
29
+ end
30
+
31
+ def i2p_loaded?
32
+ java_import java.lang.Thread
33
+ cl = Thread.currentThread.getContextClassLoader
34
+ cl.getURLs.select { |item| item.to_s.include? 'i2p.jar' }.size > 0
35
+ end
36
+
37
+ def check_and_set_props!
38
+ if System.getProperties['i2p.dir.base'].nil?
39
+ unless ENV['I2PDIR'].nil?
40
+ System.setProperty 'i2p.dir.base', ENV['I2PDIR'].to_s
41
+ else
42
+ raise ArgumentError, 'The system property i2p.dir.base is missing!', caller if @defaults['i2p.dir.base'].nil?
43
+ end
44
+ end
45
+ if System.getProperties['i2p.dir.config'].nil?
46
+ raise ArgumentError, 'The system property i2p.dir.config is missing!', caller if @defaults['i2p.dir.config'].nil?
47
+ System.setProperty 'i2p.dir.config', @defaults['i2p.dir.config']
48
+ end
49
+ System.setProperty 'java.awt.headless', 'true' if System.getProperties['java.awt.headless'].nil?
50
+ System.setProperty 'java.library.path', "#{System.getProperties['i2p.dir.base']}/lib" if System.getProperties['java.library.path'].nil?
51
+ end
52
+
53
+ def boot!
54
+ check_and_set_props!
55
+ load_jars unless i2p_loaded?
56
+ RouterManager.start_router!
57
+ RouterManager.router_context
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,20 @@
1
+ require 'fileutils'
2
+
3
+ module Ji2p
4
+ module Startup
5
+ class ClientApplication
6
+ java_import 'net.i2p.I2PAppContext'
7
+
8
+ def initialize name
9
+ @name = name
10
+ @ctx = Java::NetI2p::I2PAppContext.getGlobalContext
11
+ FileUtils.mkdir_p plugin_path unless File.exists? plugin_path
12
+ end
13
+
14
+ def plugin_path
15
+ @proot_path ||= File.expand_path("plugins/#{@name}", @ctx.getAppDir.getAbsolutePath)
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ require 'java'
2
+
3
+ module Ji2p::Startup
4
+ class RouterManager
5
+ @@router = nil
6
+ include_package 'net.i2p.router'
7
+
8
+ def self.start_router!
9
+ @@router = RouterLaunch.main ARGV if @@router.nil?
10
+ end
11
+
12
+ def self.router_context
13
+ RouterContext.getCurrentContext
14
+ end
15
+
16
+ def self.get_leases
17
+ ctx = RouterManager.router_context
18
+ ctx.netDb.get_leases.to_a
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,61 @@
1
+ require 'sinatra'
2
+ require 'sinatra/base'
3
+ #require 'sinatra/config_file'
4
+ require 'sinatra/contrib'
5
+ require 'sinatra/cookies'
6
+ require 'sinatra/json'
7
+ require 'sinatra/namespace'
8
+ require 'sinatra/reloader'
9
+ #require 'sinatra/webdav'
10
+ require 'better_errors'
11
+ require 'binding_of_caller'
12
+
13
+ module Ji2p
14
+ module Startup
15
+ class SinatraApp < Sinatra::Base
16
+ APP_ROOT = File.expand_path('../..', __dir__) unless defined? APP_ROOT
17
+
18
+ use Rack::Session::Cookie, :key => 'rack.session',
19
+ :domain => 'localhost',
20
+ :path => '/',
21
+ :expire_after => 2592000, # In seconds
22
+ :secret => 'kake'
23
+
24
+ set :environments, %w{development test production staging}
25
+ enable :sessions, :logging
26
+ set :sessions, true
27
+ set :logging, true
28
+ set :server, %w[puma webrick]
29
+ set :app_file, __FILE__
30
+ set :public_folder, Proc.new { File.join(APP_ROOT, 'public') }
31
+ set :protection, :session => true
32
+ unless ENV['APP_ENV'].nil?
33
+ set :environment, ENV['APP_ENV']
34
+ else
35
+ set :environment, :development
36
+ end
37
+
38
+
39
+ configure :development do
40
+ register Sinatra::Reloader
41
+
42
+ use BetterErrors::Middleware
43
+ BetterErrors.application_root = APP_ROOT
44
+
45
+ set :reload_stuff, true
46
+ end
47
+
48
+ register Sinatra::Namespace
49
+ #register Sinatra::ConfigFile
50
+
51
+ helpers Sinatra::Cookies
52
+
53
+ set :show_exceptions, false
54
+
55
+ get '/' do
56
+ json :sinatra => { :status => 'OK', :request => request.env.to_json }
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,32 @@
1
+ require 'thread'
2
+
3
+ module Ji2p
4
+ module Utils
5
+ class BlockingQueue
6
+ attr_reader :queue, :mutex, :cv
7
+
8
+ def initialize
9
+ @queue = Array.new
10
+ @mutex = Mutex.new
11
+ @cv = ConditionVariable.new
12
+ end
13
+
14
+ def push(ele)
15
+ @mutex.synchronize do
16
+ @queue.push ele
17
+ @cv.signal
18
+ end
19
+ end
20
+
21
+ def pop
22
+ @mutex.synchronize do
23
+ while @queue.empty?
24
+ @cv.wait(@mutex)
25
+ end
26
+
27
+ @queue.pop
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ module Ji2p
2
+ VERSION = '0.0.3'.freeze unless defined? VERSION
3
+ end
data/lib/ji2p_jars.rb ADDED
@@ -0,0 +1,16 @@
1
+ # this is a generated file, to avoid over-writing it just delete this comment
2
+ begin
3
+ require 'jar_dependencies'
4
+ rescue LoadError
5
+ require 'net/i2p/router/0.9.43/router-0.9.43.jar'
6
+ require 'net/i2p/client/mstreaming/0.9.43/mstreaming-0.9.43.jar'
7
+ require 'net/i2p/client/streaming/0.9.43/streaming-0.9.43.jar'
8
+ require 'net/i2p/i2p/0.9.43/i2p-0.9.43.jar'
9
+ end
10
+
11
+ if defined? Jars
12
+ require_jar 'net.i2p', 'router', '0.9.43'
13
+ require_jar 'net.i2p.client', 'mstreaming', '0.9.43'
14
+ require_jar 'net.i2p.client', 'streaming', '0.9.43'
15
+ require_jar 'net.i2p', 'i2p', '0.9.43'
16
+ end