Packages
mongodb_driver
0.9.0-rc.0
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.6
1.5.5
1.5.4
1.5.2
1.5.1
1.5.0
1.4.1
1.4.0
1.2.1
1.2.0
1.1.0
1.0.3
1.0.2
1.0.1
1.0.0
0.9.2
0.9.1
0.9.0
0.9.0-rc.1
0.9.0-rc.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
The MongoDB driver for Elixir
Current section
Files
Jump to
Current section
Files
lib/mongo/auth.ex
defmodule Mongo.Auth do
@moduledoc false
alias Mongo.PasswordSafe
def run(opts, state) do
db = opts[:database]
auth = setup(opts)
auther = mechanism(state)
auth_source = opts[:auth_source]
wire_version = state[:wire_version]
# change database for auth
state =
case auth_source != nil && wire_version > 0 do
true -> Map.put(state, :database, auth_source)
false -> state
end
# do auth
# restore old database
Enum.find_value(auth, fn credentials ->
case auther.auth(credentials, db, state) do
# everything is okay, then return nil
:ok ->
nil
error ->
{mod, socket} = state.connection
mod.close(socket)
error
end
end) || {:ok, Map.put(state, :database, opts[:database])}
end
defp setup(opts) do
username = opts[:username]
pw_safe = opts[:pw_safe]
password = PasswordSafe.get_pasword(pw_safe)
auth = opts[:auth] || []
auth =
Enum.map(auth, fn opts ->
username = opts[:username]
password = PasswordSafe.get_pasword(pw_safe)
{username, password}
end)
if username && password, do: auth ++ [{username, password}], else: auth
end
defp mechanism(%{wire_version: version, auth_mechanism: :x509}) when version >= 3, do: Mongo.Auth.X509
defp mechanism(%{wire_version: version}) when version >= 3, do: Mongo.Auth.SCRAM
defp mechanism(_), do: Mongo.Auth.CR
end