summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimponic <loganhunt@simponic.xyz>2022-12-20 01:06:18 -0700
committerSimponic <loganhunt@simponic.xyz>2022-12-21 17:21:36 -0700
commitfed5d8a9e7b9500d317f2d8664cfe8ef4138154e (patch)
treef3d084146c2d410a4c1c8d95398599ceb1c8094f
parentb18899ffaffad71a2b2f8783d97bcab876ab22a1 (diff)
downloadchessh-fed5d8a9e7b9500d317f2d8664cfe8ef4138154e.tar.gz
chessh-fed5d8a9e7b9500d317f2d8664cfe8ef4138154e.zip
Add a simple echo server
-rw-r--r--lib/chessh/auth/password.ex1
-rw-r--r--lib/chessh/schema/player.ex8
-rw-r--r--lib/chessh/shell.ex51
-rw-r--r--priv/repo/migrations/20221219082326_create_player.exs8
-rw-r--r--priv/repo/migrations/20221219215005_add_keys.exs8
5 files changed, 55 insertions, 21 deletions
diff --git a/lib/chessh/auth/password.ex b/lib/chessh/auth/password.ex
index 48a4d62..e2c26d6 100644
--- a/lib/chessh/auth/password.ex
+++ b/lib/chessh/auth/password.ex
@@ -2,7 +2,6 @@ defmodule Chessh.Auth.PasswordAuthenticator do
alias Chessh.Player
alias Chessh.Repo
use Sshd.PasswordAuthenticator
- require Logger
def authenticate(username, password) do
case Repo.get_by(Player, username: String.Chars.to_string(username)) do
diff --git a/lib/chessh/schema/player.ex b/lib/chessh/schema/player.ex
index 5b7b904..4b6a324 100644
--- a/lib/chessh/schema/player.ex
+++ b/lib/chessh/schema/player.ex
@@ -14,15 +14,15 @@ defmodule Chessh.Player do
timestamps()
end
- def registration_changeset(user, attrs, opts \\ []) do
- user
+ def registration_changeset(player, attrs, opts \\ []) do
+ player
|> cast(attrs, [:username, :password])
|> validate_username()
|> validate_password(opts)
end
- def password_changeset(user, attrs, opts \\ []) do
- user
+ def password_changeset(player, attrs, opts \\ []) do
+ player
|> cast(attrs, [:password])
|> validate_confirmation(:password, message: "does not match password")
|> validate_password(opts)
diff --git a/lib/chessh/shell.ex b/lib/chessh/shell.ex
index f9f475d..cf65ad4 100644
--- a/lib/chessh/shell.ex
+++ b/lib/chessh/shell.ex
@@ -1,18 +1,51 @@
defmodule Chessh.Shell do
use Sshd.ShellHandler
- def on_shell(_username, _public_key, _ip, _port) do
- :ok =
- IO.puts(
- "Interactive example SSH shell - type exit ENTER to quit and it is running on #{inspect(self())}"
- )
+ def on_shell(_username, _pubkey, _ip, _port) do
+ IO.puts("Looks like you're on #{inspect(self())}")
+ loop()
end
- def on_connect(_username, _ip, _port, _method) do
- Logger.debug("Connection established")
+ def on_connect(username, ip, port, method) do
+ Logger.debug(fn ->
+ """
+ Incoming SSH shell #{inspect(self())} requested for #{username} from #{inspect(ip)}:#{inspect(port)} using #{inspect(method)}
+ """
+ end)
end
- def on_disconnect(_username, _ip, _port) do
- Logger.debug("Connection disestablished")
+ def on_disconnect(username, ip, port) do
+ Logger.debug(fn ->
+ "Disconnecting SSH shell for #{username} from #{inspect(ip)}:#{inspect(port)}"
+ end)
+ end
+
+ defp loop() do
+ self_pid = self()
+ IO.write([IO.ANSI.home(), IO.ANSI.clear()])
+ IO.puts("#{inspect(:io.columns())}")
+ IO.puts("#{inspect(:io.rows())}")
+ input = spawn(fn -> io_get(self_pid) end)
+ wait_input(input)
+ end
+
+ defp wait_input(input) do
+ receive do
+ {:hello, message} ->
+ IO.puts(message)
+ loop()
+
+ {:input, ^input, x} ->
+ IO.puts(x)
+ loop()
+
+ x ->
+ Logger.debug(inspect(x))
+ loop()
+ end
+ end
+
+ defp io_get(pid) do
+ send(pid, {:input, self(), IO.gets("")})
end
end
diff --git a/priv/repo/migrations/20221219082326_create_player.exs b/priv/repo/migrations/20221219082326_create_player.exs
index b99bb5e..4c0c553 100644
--- a/priv/repo/migrations/20221219082326_create_player.exs
+++ b/priv/repo/migrations/20221219082326_create_player.exs
@@ -2,14 +2,14 @@ defmodule Chessh.Repo.Migrations.CreatePlayer do
use Ecto.Migration
def change do
- execute "CREATE EXTENSION IF NOT EXISTS citext", ""
+ execute("CREATE EXTENSION IF NOT EXISTS citext", "")
create table(:players) do
- add :username, :citext, null: false
- add :hashed_password, :string, null: false
+ add(:username, :citext, null: false)
+ add(:hashed_password, :string, null: false)
timestamps()
end
- create unique_index(:players, [:username])
+ create(unique_index(:players, [:username]))
end
end
diff --git a/priv/repo/migrations/20221219215005_add_keys.exs b/priv/repo/migrations/20221219215005_add_keys.exs
index 15163dc..06ea2c5 100644
--- a/priv/repo/migrations/20221219215005_add_keys.exs
+++ b/priv/repo/migrations/20221219215005_add_keys.exs
@@ -3,12 +3,14 @@ defmodule Chessh.Repo.Migrations.AddKeys do
def change do
create table(:keys) do
- add :key, :string, null: false
- add :name, :string, null: false
+ add(:key, :text, null: false)
+ add(:name, :string, null: false)
- add :player_id, references(:players)
+ add(:player_id, references(:players))
timestamps()
end
+
+ create(unique_index(:keys, [:player_id, :key]))
end
end