70 lines
1.9 KiB
Elixir
70 lines
1.9 KiB
Elixir
defmodule ForumWeb.LoginController do
|
|
use ForumWeb, :controller
|
|
|
|
alias Forum.Auth
|
|
alias Forum.Repo
|
|
alias Forum.User
|
|
|
|
def index(conn, _params) do
|
|
render(conn, :index, page_title: "log in")
|
|
end
|
|
|
|
def authenticate(conn, %{"username" => username, "password" => pw}) do
|
|
resp = Auth.authenticate(username, pw)
|
|
|
|
case resp["authenticated"] do
|
|
false ->
|
|
conn
|
|
|> put_session(:loggedin, false)
|
|
|> put_flash(:error, "log in failed")
|
|
|> redirect(to: login_path(conn, :index))
|
|
|> halt()
|
|
|
|
true ->
|
|
user = Repo.get_by(User, name: username)
|
|
|
|
case user do
|
|
nil ->
|
|
case Forum.create_user(%{
|
|
name: username,
|
|
bio:
|
|
"hey hi i haven't bothered to change this yet.\r\n\r\nmaybe i should update it (and put a new profile pic up? - just replace ~/public_html/avatar.png with your own img:)",
|
|
sudoer: resp["sudoer"]
|
|
}) do
|
|
{:ok, _newuser} ->
|
|
{:ok}
|
|
|
|
{:error, changeset} ->
|
|
render(conn, "new.html", changeset: changeset)
|
|
|> halt()
|
|
end
|
|
|
|
_ ->
|
|
unless user.sudoer == resp["sudoer"] do
|
|
User.changeset(user, sudoer: resp["sudoer"]) |> Repo.update()
|
|
end
|
|
end
|
|
|
|
conn
|
|
|> put_session(:loggedin, true)
|
|
|> put_session(:current_user, username)
|
|
|> put_session(:sudoer, resp["sudoer"])
|
|
|> put_flash(:info, "logged in as ~#{username}")
|
|
|> redirect(to: get_session(conn, :redirect_url))
|
|
|> halt()
|
|
|
|
_ ->
|
|
conn
|
|
end
|
|
end
|
|
|
|
def logout(conn, _params) do
|
|
conn
|
|
|> put_session(:loggedin, false)
|
|
|> put_session(:current_user, "")
|
|
|> put_session(:sudoer, false)
|
|
|> put_flash(:info, "logged out successfully")
|
|
|> redirect(to: login_path(conn, :index))
|
|
end
|
|
end
|