fargo 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/fargo/base32.c +61 -0
- data/ext/fargo/base32.h +16 -0
- data/ext/fargo/extconf.rb +8 -0
- data/ext/fargo/fargo_tth.c +34 -0
- data/ext/fargo/sboxes.c +515 -0
- data/ext/fargo/tiger.c +245 -0
- data/ext/fargo/tiger.h +41 -0
- data/ext/fargo/tigertree.c +184 -0
- data/ext/fargo/tigertree.h +48 -0
- data/ext/fargo/tth.c +100 -0
- data/ext/fargo/tth.h +18 -0
- data/lib/fargo/client.rb +47 -118
- data/lib/fargo/protocol/dc.rb +52 -0
- data/lib/fargo/{connection → protocol}/download.rb +56 -88
- data/lib/fargo/protocol/hub.rb +81 -0
- data/lib/fargo/search.rb +21 -16
- data/lib/fargo/search_result.rb +6 -6
- data/lib/fargo/supports/chat.rb +10 -7
- data/lib/fargo/supports/downloads.rb +73 -117
- data/lib/fargo/supports/file_list.rb +21 -10
- data/lib/fargo/supports/nick_list.rb +23 -14
- data/lib/fargo/supports/persistence.rb +28 -23
- data/lib/fargo/supports/searches.rb +30 -9
- data/lib/fargo/supports/timeout.rb +8 -5
- data/lib/fargo/supports/uploads.rb +5 -5
- data/lib/fargo/utils.rb +5 -4
- data/lib/fargo/version.rb +1 -1
- data/lib/fargo.rb +8 -10
- metadata +41 -19
- data/lib/fargo/connection/base.rb +0 -126
- data/lib/fargo/connection/hub.rb +0 -120
- data/lib/fargo/connection/search.rb +0 -19
- data/lib/fargo/connection/upload.rb +0 -85
- data/lib/fargo/publisher.rb +0 -42
- data/lib/fargo/server.rb +0 -52
@@ -1,17 +1,20 @@
|
|
1
1
|
module Fargo
|
2
2
|
module Supports
|
3
3
|
module Timeout
|
4
|
-
|
4
|
+
|
5
5
|
def timeout_response timeout, succeed_subscription
|
6
6
|
thread = Thread.current
|
7
|
-
|
7
|
+
|
8
|
+
subscribed_block = lambda do |args|
|
8
9
|
thread.wakeup if succeed_subscription.call(*args)
|
9
10
|
end
|
10
11
|
|
11
|
-
subscribe
|
12
|
-
|
12
|
+
id = channel.subscribe subscribed_block
|
13
|
+
|
14
|
+
yield if block_given?
|
13
15
|
sleep timeout
|
14
|
-
|
16
|
+
|
17
|
+
channel.unsubscribe id
|
15
18
|
end
|
16
19
|
|
17
20
|
end
|
data/lib/fargo/utils.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module Fargo
|
2
2
|
module Utils
|
3
|
-
|
3
|
+
|
4
4
|
# Lord knows why they're doing this...
|
5
5
|
def generate_key lock
|
6
6
|
lock_bytes = lock.bytes.to_a
|
7
7
|
bytes = []
|
8
8
|
bytes << (lock_bytes[0] ^ lock_bytes[-1] ^ lock_bytes[-2] ^ 5)
|
9
|
-
|
9
|
+
|
10
|
+
(1..lock.length-1).each{ |i|
|
10
11
|
bytes << (lock_bytes[i] ^ lock_bytes[i - 1])
|
11
12
|
}
|
12
13
|
|
@@ -14,7 +15,7 @@ module Fargo
|
|
14
15
|
bytes.each{ |b| key << encode_char(((b << 4) | (b >> 4)) & 0xff) }
|
15
16
|
key
|
16
17
|
end
|
17
|
-
|
18
|
+
|
18
19
|
# Generates a lock between 80 and 134 random characters, and a pk of 16
|
19
20
|
# random characters. At least in theory, other clients were doing exactly
|
20
21
|
# this, so I just mirrored them.
|
@@ -22,7 +23,7 @@ module Fargo
|
|
22
23
|
lock = 'EXTENDEDPROTOCOL'
|
23
24
|
[lock + ('ABC' * 6), 'ABCD' * 4]
|
24
25
|
end
|
25
|
-
|
26
|
+
|
26
27
|
# Watch out for those special ones...
|
27
28
|
def encode_char c
|
28
29
|
if [0, 5, 36, 96, 124, 126].include? c
|
data/lib/fargo/version.rb
CHANGED
data/lib/fargo.rb
CHANGED
@@ -1,26 +1,26 @@
|
|
1
|
-
require 'socket'
|
2
1
|
require 'fileutils'
|
2
|
+
require 'eventmachine'
|
3
3
|
require 'active_support/dependencies/autoload'
|
4
4
|
require 'active_support/core_ext/module/attribute_accessors'
|
5
5
|
require 'active_support/buffered_logger'
|
6
6
|
require 'active_support/concern'
|
7
|
+
require 'active_support/configurable'
|
7
8
|
|
8
9
|
module Fargo
|
9
10
|
extend ActiveSupport::Autoload
|
10
11
|
|
11
12
|
class ConnectionException < RuntimeError; end
|
12
|
-
|
13
|
+
|
13
14
|
mattr_accessor:logger
|
14
15
|
self.logger = ActiveSupport::BufferedLogger.new STDOUT
|
15
16
|
|
16
|
-
autoload :Utils
|
17
|
-
autoload :Publisher
|
17
|
+
autoload :Utils
|
18
18
|
autoload :Parser
|
19
|
-
autoload :Server
|
20
19
|
autoload :Client
|
21
20
|
autoload :Search
|
22
21
|
autoload :SearchResult
|
23
22
|
autoload :VERSION
|
23
|
+
autoload :TTH
|
24
24
|
|
25
25
|
module Supports
|
26
26
|
extend ActiveSupport::Autoload
|
@@ -35,14 +35,12 @@ module Fargo
|
|
35
35
|
autoload :FileList
|
36
36
|
end
|
37
37
|
|
38
|
-
module
|
38
|
+
module Protocol
|
39
39
|
extend ActiveSupport::Autoload
|
40
40
|
|
41
|
-
autoload :
|
41
|
+
autoload :DC
|
42
42
|
autoload :Download
|
43
43
|
autoload :Hub
|
44
|
-
autoload :Search
|
45
|
-
autoload :Upload
|
46
44
|
end
|
47
45
|
|
48
|
-
end
|
46
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fargo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Alex Crichton
|
@@ -15,11 +15,25 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-09-
|
18
|
+
date: 2010-09-27 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 3
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
requirement: *id001
|
32
|
+
type: :runtime
|
33
|
+
name: eventmachine
|
34
|
+
prerelease: false
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
23
37
|
none: false
|
24
38
|
requirements:
|
25
39
|
- - ">="
|
@@ -30,12 +44,12 @@ dependencies:
|
|
30
44
|
- 0
|
31
45
|
- 0
|
32
46
|
version: 3.0.0
|
33
|
-
requirement: *
|
47
|
+
requirement: *id002
|
34
48
|
type: :runtime
|
35
49
|
name: activesupport
|
36
50
|
prerelease: false
|
37
51
|
- !ruby/object:Gem::Dependency
|
38
|
-
version_requirements: &
|
52
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
39
53
|
none: false
|
40
54
|
requirements:
|
41
55
|
- - ">="
|
@@ -44,12 +58,12 @@ dependencies:
|
|
44
58
|
segments:
|
45
59
|
- 0
|
46
60
|
version: "0"
|
47
|
-
requirement: *
|
61
|
+
requirement: *id003
|
48
62
|
type: :runtime
|
49
63
|
name: libxml-ruby
|
50
64
|
prerelease: false
|
51
65
|
- !ruby/object:Gem::Dependency
|
52
|
-
version_requirements: &
|
66
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
53
67
|
none: false
|
54
68
|
requirements:
|
55
69
|
- - ">="
|
@@ -58,7 +72,7 @@ dependencies:
|
|
58
72
|
segments:
|
59
73
|
- 0
|
60
74
|
version: "0"
|
61
|
-
requirement: *
|
75
|
+
requirement: *id004
|
62
76
|
type: :runtime
|
63
77
|
name: bzip2-ruby
|
64
78
|
prerelease: false
|
@@ -66,23 +80,30 @@ description: Direct Connect (DC) Client implemented in pure Ruby
|
|
66
80
|
email: alex@alexcrichton.com
|
67
81
|
executables: []
|
68
82
|
|
69
|
-
extensions:
|
70
|
-
|
83
|
+
extensions:
|
84
|
+
- ext/fargo/extconf.rb
|
71
85
|
extra_rdoc_files: []
|
72
86
|
|
73
87
|
files:
|
88
|
+
- ext/fargo/base32.c
|
89
|
+
- ext/fargo/base32.h
|
90
|
+
- ext/fargo/extconf.rb
|
91
|
+
- ext/fargo/fargo_tth.c
|
92
|
+
- ext/fargo/sboxes.c
|
93
|
+
- ext/fargo/tiger.c
|
94
|
+
- ext/fargo/tiger.h
|
95
|
+
- ext/fargo/tigertree.c
|
96
|
+
- ext/fargo/tigertree.h
|
97
|
+
- ext/fargo/tth.c
|
98
|
+
- ext/fargo/tth.h
|
74
99
|
- lib/fargo.rb
|
75
100
|
- lib/fargo/client.rb
|
76
|
-
- lib/fargo/connection/base.rb
|
77
|
-
- lib/fargo/connection/download.rb
|
78
|
-
- lib/fargo/connection/hub.rb
|
79
|
-
- lib/fargo/connection/search.rb
|
80
|
-
- lib/fargo/connection/upload.rb
|
81
101
|
- lib/fargo/parser.rb
|
82
|
-
- lib/fargo/
|
102
|
+
- lib/fargo/protocol/dc.rb
|
103
|
+
- lib/fargo/protocol/download.rb
|
104
|
+
- lib/fargo/protocol/hub.rb
|
83
105
|
- lib/fargo/search.rb
|
84
106
|
- lib/fargo/search_result.rb
|
85
|
-
- lib/fargo/server.rb
|
86
107
|
- lib/fargo/supports/chat.rb
|
87
108
|
- lib/fargo/supports/downloads.rb
|
88
109
|
- lib/fargo/supports/file_list.rb
|
@@ -102,6 +123,7 @@ rdoc_options:
|
|
102
123
|
- --charset=UTF-8
|
103
124
|
require_paths:
|
104
125
|
- lib
|
126
|
+
- ext
|
105
127
|
required_ruby_version: !ruby/object:Gem::Requirement
|
106
128
|
none: false
|
107
129
|
requirements:
|
@@ -1,126 +0,0 @@
|
|
1
|
-
require 'active_support/configurable'
|
2
|
-
require 'active_support/callbacks'
|
3
|
-
|
4
|
-
module Fargo
|
5
|
-
class ConnectionError < RuntimeError; end
|
6
|
-
|
7
|
-
module Connection
|
8
|
-
class Base
|
9
|
-
|
10
|
-
include ActiveSupport::Configurable
|
11
|
-
include ActiveSupport::Callbacks
|
12
|
-
include Fargo::Publisher
|
13
|
-
|
14
|
-
attr_accessor :socket
|
15
|
-
define_callbacks :listen
|
16
|
-
|
17
|
-
def initialize client
|
18
|
-
@outgoing = Queue.new
|
19
|
-
@client = client
|
20
|
-
config.quit_on_disconnect = true
|
21
|
-
end
|
22
|
-
|
23
|
-
def connect
|
24
|
-
Fargo.logger.info(
|
25
|
-
"#{self}: Opening connection with #{config.address}, #{config.port}"
|
26
|
-
)
|
27
|
-
|
28
|
-
open_socket
|
29
|
-
listen
|
30
|
-
|
31
|
-
connection_type = self.class.name.split('::').last.downcase
|
32
|
-
@client.publish :"#{connection_type}_connection_opened"
|
33
|
-
end
|
34
|
-
|
35
|
-
def receive
|
36
|
-
raise 'Implement me!'
|
37
|
-
end
|
38
|
-
|
39
|
-
def open_socket
|
40
|
-
@socket ||= TCPSocket.open config.address, config.port
|
41
|
-
rescue Errno::ECONNREFUSED
|
42
|
-
raise Fargo::ConnectionError.new "Couldn't open a connection to #{config.address}:#{config.port}"
|
43
|
-
end
|
44
|
-
|
45
|
-
def connected?
|
46
|
-
!@socket.nil? && !@socket.closed?
|
47
|
-
end
|
48
|
-
|
49
|
-
def listen
|
50
|
-
return unless @threads.nil? || @threads.size == 0
|
51
|
-
|
52
|
-
run_callbacks :listen do
|
53
|
-
@threads = []
|
54
|
-
@looping = true
|
55
|
-
|
56
|
-
# Start a thread to read the socket
|
57
|
-
@threads << Thread.start { read_data while @looping }
|
58
|
-
|
59
|
-
# Start a thread to send information from the queue
|
60
|
-
@threads << Thread.start { write_data @outgoing.pop while @looping }
|
61
|
-
|
62
|
-
@threads.each { |t| t.abort_on_exception = true }
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def disconnect
|
67
|
-
Fargo.logger.debug "#{self}: Disconnecting connection"
|
68
|
-
|
69
|
-
write "$Quit #{@client.config.nick}" if config.quit_on_disconnect
|
70
|
-
|
71
|
-
@looping = false
|
72
|
-
|
73
|
-
if @threads
|
74
|
-
@threads.each{ |t| t.exit unless t == Thread.current }
|
75
|
-
@threads.clear
|
76
|
-
end
|
77
|
-
|
78
|
-
if @socket
|
79
|
-
begin
|
80
|
-
@socket.close
|
81
|
-
rescue => e
|
82
|
-
Fargo.logger.error "Error closing socket: #{e}"
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
@socket = nil
|
87
|
-
@outgoing.clear
|
88
|
-
|
89
|
-
connection_type = self.class.name.split('::').last.downcase
|
90
|
-
@client.publish :"#{connection_type}_disconnected"
|
91
|
-
end
|
92
|
-
|
93
|
-
def write string
|
94
|
-
string << '|' unless string.end_with?('|')
|
95
|
-
@outgoing << string # append this to the queue of things to be written
|
96
|
-
true
|
97
|
-
end
|
98
|
-
|
99
|
-
private
|
100
|
-
|
101
|
-
def read_data
|
102
|
-
data = @socket.gets '|'
|
103
|
-
raise ConnectionError.new('Received nil data!') if data.nil?
|
104
|
-
|
105
|
-
Fargo.logger.debug "#{self} Received: #{data.inspect}"
|
106
|
-
receive data.chomp('|')
|
107
|
-
rescue => e
|
108
|
-
unless @socket.closed?
|
109
|
-
Fargo.logger.warn "#{self}: Error reading data, going away: #{e}"
|
110
|
-
disconnect
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def write_data data
|
115
|
-
Fargo.logger.debug "#{self} Sending: #{data.inspect}"
|
116
|
-
@socket << data
|
117
|
-
rescue => e
|
118
|
-
unless @socket.closed?
|
119
|
-
Fargo.logger.warn "#{self}: Error writing data, going away: #{e}"
|
120
|
-
disconnect
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
data/lib/fargo/connection/hub.rb
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
module Fargo
|
2
|
-
module Connection
|
3
|
-
class Hub < Base
|
4
|
-
|
5
|
-
include Fargo::Utils
|
6
|
-
include Fargo::Parser
|
7
|
-
|
8
|
-
attr_reader :hubname
|
9
|
-
|
10
|
-
configure do |config|
|
11
|
-
config.address = '127.0.0.1'
|
12
|
-
config.port = 7314
|
13
|
-
end
|
14
|
-
|
15
|
-
# See <http://www.teamfair.info/DC-Protocol.htm> for specifics on
|
16
|
-
# the DC protocol
|
17
|
-
def receive data
|
18
|
-
message = parse_message data
|
19
|
-
|
20
|
-
case message[:type]
|
21
|
-
when :lock
|
22
|
-
@validated = false
|
23
|
-
write "$Key #{generate_key message[:lock]}"
|
24
|
-
when :hubname
|
25
|
-
@hubname = message[:name]
|
26
|
-
write "$ValidateNick #{@client.config.nick}" unless @validated
|
27
|
-
when :getpass
|
28
|
-
write "$MyPass #{@client.password}"
|
29
|
-
when :badpass, :hubfull
|
30
|
-
Fargo.logger.warn "Disconnecting because of: #{message.inspect}"
|
31
|
-
disconnect
|
32
|
-
when :hello
|
33
|
-
if message[:who] == @client.config.nick
|
34
|
-
Fargo.logger.info "Connected to DC Hub #{@hubname} (#{config.address}:#{config.port})"
|
35
|
-
@validated = true
|
36
|
-
|
37
|
-
write '$Version 1,0091'
|
38
|
-
write '$GetNickList'
|
39
|
-
write "$MyINFO $ALL #{@client.config.nick} " +
|
40
|
-
"#{@client.description}$ $#{@client.config.speed || 'DSL'}" +
|
41
|
-
"#{@status || 1.chr}$#{@client.config.email}" +
|
42
|
-
"$#{@client.share_size}$"
|
43
|
-
end
|
44
|
-
|
45
|
-
when :connect_to_me
|
46
|
-
if !@client.nicks.include?(message[:nick])
|
47
|
-
Fargo.logger.info "Invalid connect_to_me request from: #{message[:nick]}"
|
48
|
-
return
|
49
|
-
end
|
50
|
-
|
51
|
-
@client_connections ||= []
|
52
|
-
|
53
|
-
connection = Fargo::Connection::Download.new @client
|
54
|
-
connection.config.address = message[:address]
|
55
|
-
connection.config.port = message[:port]
|
56
|
-
# we're going to initiate the download
|
57
|
-
connection.config.first = true
|
58
|
-
|
59
|
-
# proxy all messages from them back to the client and delete the
|
60
|
-
# connection if necessary
|
61
|
-
connection.subscribe { |*args|
|
62
|
-
@client.publish *args
|
63
|
-
@client_connections.delete connection unless connection.connected?
|
64
|
-
}
|
65
|
-
|
66
|
-
# establish the connection. This will also listen for data to be
|
67
|
-
# read/written
|
68
|
-
connection.connect
|
69
|
-
|
70
|
-
# keep track of who we're downloading from
|
71
|
-
@client_connections << connection
|
72
|
-
|
73
|
-
when :search
|
74
|
-
# Make sure we received a valid search request
|
75
|
-
if message[:searcher].nil? || !@client.nicks.include?(message[:searcher])
|
76
|
-
Fargo.logger.info "Invalid search request: #{message.inspect}"
|
77
|
-
return
|
78
|
-
end
|
79
|
-
|
80
|
-
# Let the client handle the results
|
81
|
-
@results = @client.search_files message
|
82
|
-
|
83
|
-
# Send all the results to the peer. Take care of active/passive
|
84
|
-
# connections
|
85
|
-
@results.each { |r|
|
86
|
-
if message[:address]
|
87
|
-
r.active_send @client.config.nick, message[:ip], message[:port]
|
88
|
-
else
|
89
|
-
write "$SR #{@client.config.nick} #{r}"
|
90
|
-
end
|
91
|
-
}
|
92
|
-
|
93
|
-
when :revconnect
|
94
|
-
# TODO: Don't send RevConnectToMe when we're passive and
|
95
|
-
# receiving is passive
|
96
|
-
if @client.config.passive
|
97
|
-
write "$RevConnectToMe #{@client.config.nick} #{message[:who]}"
|
98
|
-
else
|
99
|
-
write "$ConnectToMe #{@client.config.nick} #{@client.config.address}:#{@client.config.extport}"
|
100
|
-
end
|
101
|
-
|
102
|
-
# proxy this message on up the stack if we don't handle it
|
103
|
-
else
|
104
|
-
@client.publish message[:type], message
|
105
|
-
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def disconnect
|
110
|
-
if @client_connections
|
111
|
-
@client_connections.each &:disconnect
|
112
|
-
@client_connections.clear
|
113
|
-
end
|
114
|
-
|
115
|
-
super
|
116
|
-
end
|
117
|
-
|
118
|
-
end # Hub
|
119
|
-
end # Connection
|
120
|
-
end # Fargo
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Fargo
|
2
|
-
module Connection
|
3
|
-
class Search < Base
|
4
|
-
|
5
|
-
# maybe do something special here at some point?
|
6
|
-
# this is currently just receiving the search result packets over UDP
|
7
|
-
# and fowarding them to the client who will handle them. This doesn't
|
8
|
-
# explicitly disconnect because I'm not sure if multiple results
|
9
|
-
# are sent. This connection will close itself because there will
|
10
|
-
# be a read error I think...
|
11
|
-
def receive data
|
12
|
-
message = parse_message data
|
13
|
-
|
14
|
-
@client.publish message[:type], message
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,85 +0,0 @@
|
|
1
|
-
# TODO: actually get this class to work in some fashion
|
2
|
-
module Fargo
|
3
|
-
module Connection
|
4
|
-
class Upload < Base
|
5
|
-
|
6
|
-
include Fargo::Utils
|
7
|
-
include Fargo::Parser
|
8
|
-
|
9
|
-
def post_listen
|
10
|
-
@lock, @pk = generate_lock
|
11
|
-
write "$MyNick #{self[:nick]}|$Lock #{@lock} Pk=#{@pk}"
|
12
|
-
@handshake_step = 0
|
13
|
-
end
|
14
|
-
|
15
|
-
def supports
|
16
|
-
"$Supports BZList TTHL TTHF" # ???
|
17
|
-
end
|
18
|
-
|
19
|
-
def receive data
|
20
|
-
message = parse_message data
|
21
|
-
publish message[:type], message
|
22
|
-
case message[:type]
|
23
|
-
when :mynick
|
24
|
-
if @handshake_step == 0
|
25
|
-
@remote_nick = message[:nick]
|
26
|
-
@handshake_step = 1
|
27
|
-
else
|
28
|
-
disconnect
|
29
|
-
end
|
30
|
-
when :lock
|
31
|
-
if @handshake_step == 1
|
32
|
-
@remote_lock = message[:lock]
|
33
|
-
@handshake_step = 2
|
34
|
-
else
|
35
|
-
disconnect
|
36
|
-
end
|
37
|
-
when :supports
|
38
|
-
if @handshake_step == 2
|
39
|
-
@remote_extensions = message[:extensions]
|
40
|
-
@handshake_step = 3
|
41
|
-
else
|
42
|
-
disconnect
|
43
|
-
end
|
44
|
-
when :direction
|
45
|
-
if @handshake_step == 3 && message[:direction] == 'download'
|
46
|
-
@handshake_step = 4
|
47
|
-
@client_num = message[:number]
|
48
|
-
else
|
49
|
-
disconnect
|
50
|
-
end
|
51
|
-
when :key
|
52
|
-
if @handshake_step == 4 && generate_key(@lock) == message[:key]
|
53
|
-
write supports
|
54
|
-
write "$Direction Download #{@my_num = rand 10000}"
|
55
|
-
write "$Key #{generate_key @remote_lock}"
|
56
|
-
@handshake_step = 5
|
57
|
-
else
|
58
|
-
disconnect
|
59
|
-
end
|
60
|
-
when :get
|
61
|
-
if @handshake_step == 5
|
62
|
-
@filepath = message[:path]
|
63
|
-
@offset = message[:offset]
|
64
|
-
write "$FileLength #{file_length}"
|
65
|
-
@handshake_step = 5
|
66
|
-
else
|
67
|
-
disconnect
|
68
|
-
end
|
69
|
-
when :send
|
70
|
-
write_chunk if @handshake_step == 5
|
71
|
-
|
72
|
-
else
|
73
|
-
# Fargo.logger.warn "Ignoring `#{data}'\n"
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def write_chunk
|
78
|
-
end
|
79
|
-
|
80
|
-
def file_length
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
data/lib/fargo/publisher.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
module Fargo
|
2
|
-
module Publisher
|
3
|
-
|
4
|
-
attr_reader :subscribers
|
5
|
-
|
6
|
-
def subscribe &subscriber
|
7
|
-
raise RuntimeError.new('Need a subscription block!') if subscriber.nil?
|
8
|
-
|
9
|
-
Fargo.logger.debug "#{self}: subscribing #{subscriber}"
|
10
|
-
(@subscribers ||= []) << subscriber
|
11
|
-
end
|
12
|
-
|
13
|
-
def subscribed_to?
|
14
|
-
@subscribers && @subscribers.size > 0
|
15
|
-
end
|
16
|
-
|
17
|
-
def unsubscribe &subscriber
|
18
|
-
raise RuntimeError.new('Need a subscription block!') if subscriber.nil?
|
19
|
-
|
20
|
-
Fargo.logger.debug "#{self}: unsubscribing #{subscriber}"
|
21
|
-
(@subscribers ||= []).delete subscriber
|
22
|
-
end
|
23
|
-
|
24
|
-
def publish message_type, hash = {}
|
25
|
-
@subscribers ||= []
|
26
|
-
|
27
|
-
to_remove = []
|
28
|
-
|
29
|
-
@subscribers.each do |subscriber|
|
30
|
-
begin
|
31
|
-
subscriber.call message_type, hash
|
32
|
-
rescue => e
|
33
|
-
Fargo.logger.warn "#{self}: error publishing to: #{subscriber}! #{e}"
|
34
|
-
to_remove << subscriber
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
@subscribers -= to_remove
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|