tcpfiletransfer 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 05f195e217bdd37c172dabe31b286f4eca7592dd3f6e4796aa87adf58b1baeb5
4
- data.tar.gz: 64cf03192f402ec6a13e095a2c0a31202b6aeb935cb48e21af68ba2be5c3774f
3
+ metadata.gz: d9f37556acb9adeccebd5bb3be4f60303050e260162506f2dc34e0ed29fbec33
4
+ data.tar.gz: 597ddb8b1aedc0071aa4da0bce1018aea983387c7dcebeb898a8c4f36993e59e
5
5
  SHA512:
6
- metadata.gz: d7dbd9504d578fa691e9b0ed7248eb45bed65a805a5a89d01680de18d1552d724df8484b5a668303c4e15619f0a2b634aa263394931fbf0fb428b2c218135ed5
7
- data.tar.gz: b461e404560f909265f9a696cecd0438b8050ca5764883f91dbb8d73ffcf6ee7968fc0eeafd4952b9acb5b2c571b72253df56d3686935a364ac06de5036a148b
6
+ metadata.gz: 2b278fcaa9740dbfcb4706dd459eab9070566f1562385717d9cf0a90c300fa9e6665f90d92485117de9ba9adfa55ee13de66143e95038ca513c603df629db034
7
+ data.tar.gz: f1ac7ab63ebb561c03cd95fe1d9525eab1474c076fa01af06b7e105116b7afb6dd71954df5182ed11c48016838dc00af240b4002d8b63cb9237ec0d820805687
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require "filetransfer"
3
+ x=FileTransfer::Server.new
4
+ x.start
data/bin/sendfile ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ require "filetransfer"
3
+ require "socket"
4
+
5
+ path = ARGV[0].gsub(" ", "`")
6
+ name = ARGV[0].split("/").last.gsub(" ", "_")
7
+
8
+ print "Recipient: "
9
+ recipient = $stdin.gets.chomp
10
+
11
+ server = TCPSocket.new("127.0.0.1", 8021)
12
+ server.puts "FTSUBMIT #{name} #{path}"
13
+ fileid = server.gets
14
+
15
+ file_size = '%.2f' % (File.size(ARGV[0]).to_f / 2**20)
16
+
17
+ server = TCPSocket.new(recipient, 8021)
18
+ server.puts "FTSEND #{name.gsub(" ", "_")} #{file_size}MB #{fileid}"
19
+
20
+ exit
@@ -0,0 +1,28 @@
1
+ module FileTransfer
2
+ module FTserver
3
+ def self.handle_client(initdata, client)
4
+ filename = initdata[1]
5
+ filesize = initdata[2]
6
+ fileid = initdata[3]
7
+ sock_domain, remote_port, remote_hostname, remote_ip = client.peeraddr
8
+
9
+ Notifier.file_transfer_notification(filename: filename, source: remote_hostname, filesize: filesize, accept_link: "http://#{remote_ip}:8021/#{fileid}")
10
+ client.close
11
+ end
12
+
13
+ def self.handle_file_submission(initdata, client)
14
+ filename = initdata[1]
15
+ filepath = initdata[2].gsub("`", " ")
16
+
17
+ fileid = self.genfileid(6)
18
+ $active_transfers[?/ + fileid] = {name: filename, path: filepath}
19
+ client.puts fileid
20
+ client.close
21
+ end
22
+
23
+ def self.genfileid(length)
24
+ ((('a'..'z').to_a+('A'..'Z').to_a+(0..9).to_a*3).shuffle*((length.to_f/82.0).ceil))[0...length].join
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,23 @@
1
+ module FileTransfer
2
+ module HTTPserver
3
+ def self.handle_client(initdata, client)
4
+ path = initdata[1]
5
+ file = $active_transfers[path]
6
+
7
+ read = true
8
+ while read
9
+ x= client.gets
10
+ read = false if x == "\r\n" || !x
11
+ end
12
+
13
+ if !file
14
+ client.puts "HTTP/1.0 404\r\nContent-Type: text/plain\r\n\r\nFile not found."
15
+ client.close
16
+ return
17
+ end
18
+ client.puts "HTTP/1.0 200\r\nContent-Type: application/octet-stream\r\nContent-Disposition: attachment; filename=\"#{file[:name]}\"\r\n\r\n#{File.read(file[:path])}"
19
+ $active_transfers.delete(path)
20
+ client.close
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,12 @@
1
+ module FileTransfer
2
+ module Notifier
3
+ def self.file_transfer_notification(filename:, source:, filesize:, accept_link:)
4
+ notification_title = "Incoming file transfer from #{source}"
5
+ fileinfo = "Name: #{filename}\nSize: #{filesize}"
6
+ links = "Click to accept: #{accept_link}"
7
+ notification_body = "#{fileinfo}\n#{links}"
8
+ notification_command = "notify-send '#{notification_title}' \"#{notification_body}\""
9
+ system(notification_command)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,26 @@
1
+ module FileTransfer
2
+ class Server
3
+ def initialize(port:8021, listen:"0.0.0.0")
4
+ @port = port
5
+ @listen = listen
6
+ end
7
+
8
+ def start
9
+ @server = TCPServer.new(@listen, @port)
10
+ loop do
11
+ Thread.start(@server.accept) do |client|
12
+ initdata = client.gets.split(" ")
13
+ if initdata[0] == "GET"
14
+ HTTPserver.handle_client(initdata, client)
15
+ elsif initdata[0] == "FTSEND"
16
+ FTserver.handle_client(initdata, client)
17
+ elsif initdata[0] == "FTSUBMIT"
18
+ FTserver.handle_file_submission(initdata, client)
19
+ else
20
+ client.close
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ $active_transfers = {
2
+ }
3
+
4
+ module FileTransfer
5
+ @@files = ['server.rb', 'notifier.rb', 'httpserver.rb', 'ftserver.rb']
6
+
7
+ def self.version
8
+ "0.0.1"
9
+ end
10
+
11
+ def self.file_paths(relative:false)
12
+ x = @@files.map do |f|
13
+ "#{"lib/" unless relative}filetransfer/#{f}"
14
+ end
15
+
16
+ if relative
17
+ return x
18
+ else
19
+ return x + ['lib/filetransfer.rb']
20
+ end
21
+ end
22
+ end
23
+
24
+ require "socket"
25
+ FileTransfer.file_paths(relative:true).each do |f|
26
+ require_relative f
27
+ end
metadata CHANGED
@@ -1,21 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tcpfiletransfer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthias Lee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-24 00:00:00.000000000 Z
11
+ date: 2023-03-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: An easy way to transfer files over TCP between linux computers
14
14
  email: matthias@matthiasclee.com
15
- executables: []
15
+ executables:
16
+ - filetransfer_server
17
+ - sendfile
16
18
  extensions: []
17
19
  extra_rdoc_files: []
18
- files: []
20
+ files:
21
+ - bin/filetransfer_server
22
+ - bin/sendfile
23
+ - lib/filetransfer.rb
24
+ - lib/filetransfer/ftserver.rb
25
+ - lib/filetransfer/httpserver.rb
26
+ - lib/filetransfer/notifier.rb
27
+ - lib/filetransfer/server.rb
19
28
  homepage: https://github.com/Matthiasclee/filetransfer
20
29
  licenses: []
21
30
  metadata: {}