update copyright years to 2019
[akkoma] / lib / pleroma / captcha / kocaptcha.ex
index abccbf6d395886fb2584c2fd887b0da54723977e..66f9ce7544bcd7260ade66c49f77902294175773 100644 (file)
@@ -1,4 +1,10 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
 defmodule Pleroma.Captcha.Kocaptcha do
+  alias Calendar.DateTime
+
   alias Pleroma.Captcha.Service
   @behaviour Service
 
@@ -7,15 +13,21 @@ defmodule Pleroma.Captcha.Kocaptcha do
   @impl Service
   def new() do
     endpoint = Pleroma.Config.get!([__MODULE__, :endpoint])
-    case HTTPoison.get(endpoint <> "/new") do
+
+    case Tesla.get(endpoint <> "/new") do
       {:error, _} ->
         %{error: "Kocaptcha service unavailable"}
+
       {:ok, res} ->
         json_resp = Poison.decode!(res.body)
 
         token = json_resp["token"]
 
-        true = :ets.insert(@ets, {token, json_resp["md5"]})
+        true =
+          :ets.insert(
+            @ets,
+            {token, json_resp["md5"], DateTime.now_utc() |> DateTime.Format.unix()}
+          )
 
         %{type: :kocaptcha, token: token, url: endpoint <> json_resp["url"]}
     end
@@ -24,8 +36,8 @@ defmodule Pleroma.Captcha.Kocaptcha do
   @impl Service
   def validate(token, captcha) do
     with false <- is_nil(captcha),
-         [{^token, saved_md5}] <- :ets.lookup(@ets, token),
-         true <- (:crypto.hash(:md5, captcha) |> Base.encode16) == String.upcase(saved_md5) do
+         [{^token, saved_md5, _}] <- :ets.lookup(@ets, token),
+         true <- :crypto.hash(:md5, captcha) |> Base.encode16() == String.upcase(saved_md5) do
       # Clear the saved value
       :ets.delete(@ets, token)
 
@@ -34,4 +46,26 @@ defmodule Pleroma.Captcha.Kocaptcha do
       _ -> false
     end
   end
+
+  @impl Service
+  def cleanup() do
+    seconds_retained = Pleroma.Config.get!([Pleroma.Captcha, :seconds_retained])
+    # If the time in ETS is less than current_time - seconds_retained, then the time has
+    # already passed
+    delete_after =
+      DateTime.subtract!(DateTime.now_utc(), seconds_retained) |> DateTime.Format.unix()
+
+    :ets.select_delete(
+      @ets,
+      [
+        {
+          {:_, :_, :"$1"},
+          [{:<, :"$1", {:const, delete_after}}],
+          [true]
+        }
+      ]
+    )
+
+    :ok
+  end
 end