Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions lib/ex_ftp/passive_socket.ex
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ defmodule ExFTP.PassiveSocket do
end

def close(pid) do
GenServer.call(pid, {:close}, :infinity)
rescue
_ -> :ok
if Process.alive?(pid) do
GenServer.call(pid, {:close}, :infinity)
end
end

# Server
Expand Down
17 changes: 6 additions & 11 deletions lib/ex_ftp/storage/file_connector.ex
Original file line number Diff line number Diff line change
Expand Up @@ -396,17 +396,12 @@ defmodule ExFTP.Storage.FileConnector do
fn stream ->
fs = File.stream!(path)

try do
_ =
stream
|> chunk_stream(opts)
|> Enum.into(fs)

{:ok, connector_state}
rescue
_ ->
{:error, "Failed to transfer"}
end
_ =
stream
|> chunk_stream(opts)
|> Enum.into(fs)

{:ok, connector_state}
end
end

Expand Down
35 changes: 1 addition & 34 deletions lib/ex_ftp/storage/s3_connector.ex
Original file line number Diff line number Diff line change
Expand Up @@ -493,53 +493,22 @@ defmodule ExFTP.Storage.S3Connector do
|> ExAws.request()
end

defp s3_prefix_exists?(%{storage_bucket: nil}, "/" = _path) do
true
end

defp s3_prefix_exists?(config, path) do
bucket = get_bucket(config, path)
prefix = get_prefix(config, bucket, path)

if bucket do
bucket_exists?(bucket) && prefix_exists?(bucket, prefix)
else
prefix_exists?(bucket, prefix)
end
bucket_exists?(bucket) && prefix_exists?(bucket, prefix)
end

# / == s3://storage_bucket/
defp get_bucket(%{storage_bucket: storage_bucket} = _config, _path) when not is_nil(storage_bucket),
do: storage_bucket

# / == list buckets
defp get_bucket(%{storage_bucket: nil} = _config, "/" = _path), do: nil

# /path == s3://path/
defp get_bucket(%{storage_bucket: nil} = _config, path) do
path
|> Path.split()
|> case do
["/", bucket | _] -> bucket
_ -> nil
end
end

# / == s3://storage_bucket/
defp get_prefix(%{storage_bucket: storage_bucket} = _config, _bucket, "/" = _path) when not is_nil(storage_bucket) do
nil
end

# /path == s3://path
defp get_prefix(%{storage_bucket: nil} = _config, bucket, path) do
prefix =
path
|> String.replace("/#{bucket}", "")
|> String.replace(~r/^\//, "")

if "" != prefix, do: prefix
end

defp get_prefix(_config, _bucket, path) do
prefix = String.replace(path, ~r/^\//, "")

Expand Down Expand Up @@ -571,8 +540,6 @@ defmodule ExFTP.Storage.S3Connector do
!empty?
end

defp prefix_exists?(_bucket, _prefix), do: true

defp get_virtual_directories(_config, %{virtual_directories: dirs}) do
dirs
end
Expand Down
2 changes: 1 addition & 1 deletion lib/ex_ftp/worker.ex
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ defmodule ExFTP.Worker do
if pasv && Process.alive?(pasv) do
{:ok, pasv}
else
send_resp(550, "LIST failed. PASV mode required.", Map.get(state, :socket))
send_resp(550, "CMD failed. PASV mode required.", Map.get(state, :socket))
{:noreply, state}
end
end
Expand Down
3 changes: 3 additions & 0 deletions test/ex_ftp/storage/file_connector_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ defmodule ExFTP.Storage.FileConnectorTest do
Enum.each(files_to_find, fn file_to_find ->
assert [_found] = Enum.filter(parts, fn part -> String.ends_with?(part, file_to_find) end)
end)

listing = test_list(state, "/")
assert String.trim(listing) != ""
end

test "DELE", state do
Expand Down
54 changes: 54 additions & 0 deletions test/ex_ftp/worker_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
defmodule ExFTP.WorkerTest do
use ExUnit.Case

import ExFTP.TestHelper

alias ExFTP.Auth.PassthroughAuth
alias ExFTP.Storage.FileConnector

doctest ExFTP.Worker

setup do
Application.put_env(:ex_ftp, :authenticator, PassthroughAuth)
Application.put_env(:ex_ftp, :storage_connector, FileConnector)
Application.put_env(:ex_ftp, :storage_config, %{})

socket = get_socket()
username = Faker.Internet.user_name()
password = Faker.Internet.slug()

socket
|> send_and_expect("USER", [username], 331, "User name okay, need password")
|> send_and_expect("PASS", [password], 230, "Welcome.")

%{
socket: socket,
password: password,
storage_connector: FileConnector,
connector_state: %{current_working_directory: "/"}
}
end

test "quit", %{socket: socket} do
send_and_expect(socket, "QUIT", [], 221)
end

test "syst", %{socket: socket} do
send_and_expect(socket, "SYST", [], 215)
end

test "type", %{socket: socket} do
send_and_expect(socket, "TYPE", ["I"], 200)
|> send_and_expect("TYPE", ["A"], 200)
|> send_and_expect("TYPE", ["X"], 504)
end

test "epsv/eprt", %{socket: socket} do
send_and_expect(socket, "EPSV", [], 229)
|> send_and_expect("EPRT", ["123"], 200)
end

test "not implemented", %{socket: socket} do
send_and_expect(socket, "CUSTOM", [], 502)
end
end
1 change: 1 addition & 0 deletions test/test_helper.exs
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ defmodule ExFTP.StorageTester do
send_and_expect(socket, "PWD", [], 257, "\"/\" is the current directory")

socket
|> send_and_expect("CWD", ["~"], 250, "Directory changed successfully.")
|> send_and_expect("MKD", [tmp_dir], 257, "\"#{tmp_dir}\" directory created.")
|> send_and_expect("CWD", [tmp_dir], 250, "Directory changed successfully.")
|> send_and_expect("PWD", [], 257, "\"#{tmp_dir}\" is the current directory")
Expand Down
Loading