tcpfiletransfer 0.0.0 → 0.0.2

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: e005ed341e7ad32bd25da861e12016086718770546fb67b2dc67d5f35482ba47
4
+ data.tar.gz: 6b5cf39b2487f212e312f7d08e50a694b55c19da06a616e05258d62730c613c8
5
5
  SHA512:
6
- metadata.gz: d7dbd9504d578fa691e9b0ed7248eb45bed65a805a5a89d01680de18d1552d724df8484b5a668303c4e15619f0a2b634aa263394931fbf0fb428b2c218135ed5
7
- data.tar.gz: b461e404560f909265f9a696cecd0438b8050ca5764883f91dbb8d73ffcf6ee7968fc0eeafd4952b9acb5b2c571b72253df56d3686935a364ac06de5036a148b
6
+ metadata.gz: cece0bfbbb48a0f5822bd5ae2f40ff1cd3e380b7f9246da76c5397b338e6aa8bbda0c9ed24661ca2595265a53aecdc3767c1be262f7cb50d89360999c81e2293
7
+ data.tar.gz: 2c575003511c688ae6bc5d16c661feec4b9bc17b63a5b7c66a9dd205bb065bccb8686df523811ba1bff836396a981b5db845e769afb56239dd3c38602b8cc718
@@ -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,21 @@
1
+ #!/usr/bin/env ruby
2
+ require "filetransfer"
3
+ require "socket"
4
+
5
+ originalpath = ARGV[0] || `zenity --file-selection --title='Send File'`.chomp
6
+
7
+ path = originalpath.gsub(" ", "`")
8
+ name = originalpath.split("/").last.gsub(" ", "_")
9
+
10
+ recipient = ARGV[1] || `zenity --text='Recipient' --entry --title='Send File'`.chomp
11
+
12
+ server = TCPSocket.new("127.0.0.1", 8021)
13
+ server.puts "FTSUBMIT #{name} #{path}"
14
+ fileid = server.gets
15
+
16
+ file_size = '%.2f' % (File.size(originalpath).to_f / 2**20)
17
+
18
+ server = TCPSocket.new(recipient, 8021)
19
+ server.puts "FTSEND #{name.gsub(" ", "_")} #{file_size}MB #{fileid}"
20
+
21
+ 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.2"
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.2
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: {}