Require explicit support request confirmation

This commit is contained in:
SimpleTest 2026-08-26 03:35:14 +03:00
parent 92e6ee8d70
commit 033718b9f4
16 changed files with 404 additions and 85 deletions

View File

@ -74,6 +74,14 @@ const activateProtectedTokenFragment = () => {
{ {
form: document.getElementById("email-change-fragment-form"), form: document.getElementById("email-change-fragment-form"),
input: document.getElementById("email-change-fragment-token") input: document.getElementById("email-change-fragment-token")
},
{
form: document.getElementById("support-confirmation-fragment-form"),
input: document.getElementById("support-confirmation-fragment-token")
},
{
form: document.getElementById("content-removal-confirmation-fragment-form"),
input: document.getElementById("content-removal-confirmation-fragment-token")
} }
] ]

View File

@ -138,7 +138,7 @@ defmodule WhoNeedHelp.ContentRemoval do
token = confirmation_token(notice) token = confirmation_token(notice)
PublicAccess.url( PublicAccess.url(
"/legal/content-removal/#{notice.id}/verify?token=#{URI.encode_www_form(token)}" "/legal/content-removal/#{notice.id}/verify#token=#{URI.encode_www_form(token)}"
) )
end end

View File

@ -13,7 +13,7 @@ defmodule WhoNeedHelp.ContentRemoval.Notifier do
""" """
Confirm the email address for removal notice #{notice.reference}. Confirm the email address for removal notice #{notice.reference}.
The notice has not been added to the staff review queue yet. Open this private link to verify the address and submit it for review: The notice has not been added to the staff review queue yet. Open this private link, then press the confirmation button to verify the address and submit it for review:
#{status_url} #{status_url}
If you did not make this request, ignore this email. It will not reach the review queue. If you did not make this request, ignore this email. It will not reach the review queue.

View File

@ -198,7 +198,7 @@ defmodule WhoNeedHelp.Support do
def confirmation_url(%SupportRequest{} = request) do def confirmation_url(%SupportRequest{} = request) do
token = confirmation_token(request) token = confirmation_token(request)
PublicAccess.url("/support/cases/#{request.id}/verify?token=#{URI.encode_www_form(token)}") PublicAccess.url("/support/cases/#{request.id}/verify#token=#{URI.encode_www_form(token)}")
end end
def paginate_for_staff(%Scope{user: user}, options \\ []) do def paginate_for_staff(%Scope{user: user}, options \\ []) do

View File

@ -12,7 +12,7 @@ defmodule WhoNeedHelp.Support.Notifier do
""" """
Confirm the email address for support request #{request.reference}. Confirm the email address for support request #{request.reference}.
Your request has not been sent to the support queue yet. Open this private link to verify the address and submit it for review: Your request has not been sent to the support queue yet. Open this private link, then press the confirmation button to verify the address and submit it for review:
#{status_url} #{status_url}
If you did not make this request, ignore this email. It will not reach the support queue. If you did not make this request, ignore this email. It will not reach the support queue.

View File

@ -61,6 +61,21 @@ defmodule WhoNeedHelpWeb.ContentRemovalController do
end end
end end
def verify_page(conn, %{"id" => id}) do
case Ecto.UUID.cast(id) do
{:ok, _id} ->
render(conn, :verify,
notice_id: id,
page_title: gettext("Confirm content-removal notice")
)
:error ->
send_resp(conn, :not_found, "Not found")
end
end
def verify_page(conn, _params), do: send_resp(conn, :not_found, "Not found")
def verify(conn, %{"id" => id, "token" => token}) do def verify(conn, %{"id" => id, "token" => token}) do
case ContentRemoval.verify_by_confirmation_token(id, token) do case ContentRemoval.verify_by_confirmation_token(id, token) do
{:ok, notice} -> {:ok, notice} ->

View File

@ -0,0 +1,44 @@
<Layouts.app
flash={@flash}
current_scope={@current_scope}
page_width={:narrow}
page_align={:center}
>
<div class="text-center">
<.header>
{gettext("Confirm content-removal notice")}
<:subtitle>
{gettext("Confirm that you submitted this notice before it is sent for review.")}
</:subtitle>
</.header>
<.form
for={%{}}
action={~p"/legal/content-removal/#{@notice_id}/verify"}
id="content-removal-confirmation-fragment-form"
hidden
>
<input
id="content-removal-confirmation-fragment-token"
type="hidden"
name="token"
value=""
/>
<.button variant="primary" phx-disable-with={gettext("Confirming...")}>
{gettext("Confirm content-removal notice")}
</.button>
</.form>
<p class="mt-5 text-sm text-base-content/70">
{gettext(
"If you did not submit this notice, close this page. Nothing will be sent for review."
)}
</p>
<noscript>
<p class="alert alert-error mt-5">
{gettext("JavaScript is required to confirm this protected email link.")}
</p>
</noscript>
</div>
</Layouts.app>

View File

@ -98,6 +98,21 @@ defmodule WhoNeedHelpWeb.SupportController do
end end
end end
def verify_page(conn, %{"id" => id}) do
case Ecto.UUID.cast(id) do
{:ok, _id} ->
render(conn, :verify,
request_id: id,
page_title: gettext("Confirm support request")
)
:error ->
send_resp(conn, :not_found, "Not found")
end
end
def verify_page(conn, _params), do: send_resp(conn, :not_found, "Not found")
def verify(conn, %{"id" => id, "token" => token}) do def verify(conn, %{"id" => id, "token" => token}) do
case Support.verify_by_confirmation_token(id, token) do case Support.verify_by_confirmation_token(id, token) do
{:ok, request} -> {:ok, request} ->

View File

@ -0,0 +1,39 @@
<Layouts.app
flash={@flash}
current_scope={@current_scope}
page_width={:narrow}
page_align={:center}
>
<div class="text-center">
<.header>
{gettext("Confirm support request")}
<:subtitle>
{gettext("Confirm that you submitted this request before it is sent to support.")}
</:subtitle>
</.header>
<.form
for={%{}}
action={~p"/support/cases/#{@request_id}/verify"}
id="support-confirmation-fragment-form"
hidden
>
<input id="support-confirmation-fragment-token" type="hidden" name="token" value="" />
<.button variant="primary" phx-disable-with={gettext("Confirming...")}>
{gettext("Confirm support request")}
</.button>
</.form>
<p class="mt-5 text-sm text-base-content/70">
{gettext(
"If you did not submit this request, close this page. Nothing will be sent to support."
)}
</p>
<noscript>
<p class="alert alert-error mt-5">
{gettext("JavaScript is required to confirm this protected email link.")}
</p>
</noscript>
</div>
</Layouts.app>

View File

@ -97,7 +97,8 @@ defmodule WhoNeedHelpWeb.Router do
get "/support/new", SupportController, :new get "/support/new", SupportController, :new
post "/support", SupportController, :create post "/support", SupportController, :create
get "/support/received", SupportController, :received get "/support/received", SupportController, :received
get "/support/cases/:id/verify", SupportController, :verify get "/support/cases/:id/verify", SupportController, :verify_page
post "/support/cases/:id/verify", SupportController, :verify
get "/support/cases/:id", SupportController, :show get "/support/cases/:id", SupportController, :show
post "/support/cases/:id/messages", SupportController, :add_message post "/support/cases/:id/messages", SupportController, :add_message
post "/support/cases/:id/reopen", SupportController, :reopen post "/support/cases/:id/reopen", SupportController, :reopen
@ -167,7 +168,8 @@ defmodule WhoNeedHelpWeb.Router do
scope "/", WhoNeedHelpWeb do scope "/", WhoNeedHelpWeb do
pipe_through :browser pipe_through :browser
get "/legal/content-removal/:id/verify", ContentRemovalController, :verify get "/legal/content-removal/:id/verify", ContentRemovalController, :verify_page
post "/legal/content-removal/:id/verify", ContentRemovalController, :verify
get "/legal/content-removal/:id", ContentRemovalController, :show get "/legal/content-removal/:id", ContentRemovalController, :show
end end

View File

@ -560,6 +560,8 @@ msgstr ""
msgid "Confirm your email and ensure your account is active before publishing." msgid "Confirm your email and ensure your account is active before publishing."
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:27
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:22
#: lib/who_need_help_web/controllers/user_session_html/new.html.heex:57 #: lib/who_need_help_web/controllers/user_session_html/new.html.heex:57
#: lib/who_need_help_web/controllers/user_session_html/new.html.heex:63 #: lib/who_need_help_web/controllers/user_session_html/new.html.heex:63
#: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:20 #: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:20
@ -2520,6 +2522,8 @@ msgstr ""
msgid "Could not unblock this user. Please try again." msgid "Could not unblock this user. Please try again."
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:40
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:35
#: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:27 #: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:27
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "JavaScript is required to confirm this protected email link." msgid "JavaScript is required to confirm this protected email link."
@ -3115,7 +3119,7 @@ msgid "Removal notice updated."
msgstr "" msgstr ""
#: lib/who_need_help_web/components/layouts.ex:201 #: lib/who_need_help_web/components/layouts.ex:201
#: lib/who_need_help_web/controllers/content_removal_controller.ex:136 #: lib/who_need_help_web/controllers/content_removal_controller.ex:151
#: lib/who_need_help_web/controllers/support_html/new.html.heex:16 #: lib/who_need_help_web/controllers/support_html/new.html.heex:16
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Report content" msgid "Report content"
@ -3131,7 +3135,7 @@ msgstr ""
msgid "Reported locations" msgid "Reported locations"
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/support_controller.ex:226 #: lib/who_need_help_web/controllers/support_controller.ex:241
#: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:6 #: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:6
#: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:42 #: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:42
#: lib/who_need_help_web/controllers/user_settings_html/edit.html.heex:128 #: lib/who_need_help_web/controllers/user_settings_html/edit.html.heex:128
@ -3249,7 +3253,7 @@ msgstr ""
msgid "TAKE IT DOWN" msgid "TAKE IT DOWN"
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/content_removal_controller.ex:135 #: lib/who_need_help_web/controllers/content_removal_controller.ex:150
#: lib/who_need_help_web/controllers/support_html/new.html.heex:19 #: lib/who_need_help_web/controllers/support_html/new.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "TAKE IT DOWN request" msgid "TAKE IT DOWN request"
@ -3277,7 +3281,7 @@ msgstr ""
msgid "Threat to life or safety" msgid "Threat to life or safety"
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/content_removal_controller.ex:103 #: lib/who_need_help_web/controllers/content_removal_controller.ex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Too many removal notices. Please try again later." msgid "Too many removal notices. Please try again later."
msgstr "" msgstr ""
@ -5242,7 +5246,7 @@ msgid "Case status"
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/page_html/child_safety.html.heex:42 #: lib/who_need_help_web/controllers/page_html/child_safety.html.heex:42
#: lib/who_need_help_web/controllers/support_controller.ex:227 #: lib/who_need_help_web/controllers/support_controller.ex:242
#: lib/who_need_help_web/live/report_live.ex:50 #: lib/who_need_help_web/live/report_live.ex:50
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Contact support" msgid "Contact support"
@ -5253,7 +5257,7 @@ msgstr ""
msgid "Content-removal notice %{reference}" msgid "Content-removal notice %{reference}"
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/content_removal_controller.ex:111 #: lib/who_need_help_web/controllers/content_removal_controller.ex:126
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Content-removal notice received" msgid "Content-removal notice received"
msgstr "" msgstr ""
@ -5264,8 +5268,8 @@ msgstr ""
msgid "Conversation" msgid "Conversation"
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/support_controller.ex:137 #: lib/who_need_help_web/controllers/support_controller.ex:152
#: lib/who_need_help_web/controllers/support_controller.ex:153 #: lib/who_need_help_web/controllers/support_controller.ex:168
#: lib/who_need_help_web/live/support_case_live.ex:73 #: lib/who_need_help_web/live/support_case_live.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not send your message. Please check it and try again." msgid "Could not send your message. Please check it and try again."
@ -5328,7 +5332,7 @@ msgstr ""
msgid "No status history is available for this older case." msgid "No status history is available for this older case."
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/support_controller.ex:172 #: lib/who_need_help_web/controllers/support_controller.ex:187
#: lib/who_need_help_web/live/support_case_live.ex:95 #: lib/who_need_help_web/live/support_case_live.ex:95
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Only a resolved or closed request can be reopened." msgid "Only a resolved or closed request can be reopened."
@ -5438,7 +5442,7 @@ msgstr ""
msgid "Support request created" msgid "Support request created"
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/support_controller.ex:183 #: lib/who_need_help_web/controllers/support_controller.ex:198
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Support request received" msgid "Support request received"
msgstr "" msgstr ""
@ -5474,7 +5478,7 @@ msgstr ""
msgid "The requester states whether the medicine is paid, reserved, or still needs to be purchased." msgid "The requester states whether the medicine is paid, reserved, or still needs to be purchased."
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/support_controller.ex:167 #: lib/who_need_help_web/controllers/support_controller.ex:182
#: lib/who_need_help_web/live/support_case_live.ex:88 #: lib/who_need_help_web/live/support_case_live.ex:88
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "The support request is open again." msgid "The support request is open again."
@ -5502,7 +5506,7 @@ msgstr ""
msgid "This support request is no longer available." msgid "This support request is no longer available."
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/support_controller.ex:143 #: lib/who_need_help_web/controllers/support_controller.ex:158
#: lib/who_need_help_web/live/support_case_live.ex:60 #: lib/who_need_help_web/live/support_case_live.ex:60
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Too many messages. Please try again later." msgid "Too many messages. Please try again later."
@ -5539,7 +5543,7 @@ msgstr ""
msgid "Your content-removal notices" msgid "Your content-removal notices"
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/support_controller.ex:130 #: lib/who_need_help_web/controllers/support_controller.ex:145
#: lib/who_need_help_web/live/support_case_live.ex:53 #: lib/who_need_help_web/live/support_case_live.ex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your message was sent to support." msgid "Your message was sent to support."
@ -7677,12 +7681,12 @@ msgstr ""
msgid "You do not have permission for this action. Role changes also require a recent sign-in." msgid "You do not have permission for this action. Role changes also require a recent sign-in."
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/content_removal_controller.ex:70 #: lib/who_need_help_web/controllers/content_removal_controller.ex:85
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your email was confirmed and the notice was sent for review." msgid "Your email was confirmed and the notice was sent for review."
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/support_controller.ex:107 #: lib/who_need_help_web/controllers/support_controller.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your email was confirmed and the request was sent to support." msgid "Your email was confirmed and the request was sent to support."
msgstr "" msgstr ""
@ -7872,3 +7876,37 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Copy and paste this secure address into your browser:" msgid "Copy and paste this secure address into your browser:"
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/content_removal_controller.ex:69
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:9
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:28
#, elixir-autogen, elixir-format
msgid "Confirm content-removal notice"
msgstr ""
#: lib/who_need_help_web/controllers/support_controller.ex:106
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:9
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:23
#, elixir-autogen, elixir-format
msgid "Confirm support request"
msgstr ""
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:11
#, elixir-autogen, elixir-format
msgid "Confirm that you submitted this notice before it is sent for review."
msgstr ""
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:11
#, elixir-autogen, elixir-format
msgid "Confirm that you submitted this request before it is sent to support."
msgstr ""
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:33
#, elixir-autogen, elixir-format
msgid "If you did not submit this notice, close this page. Nothing will be sent for review."
msgstr ""
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:28
#, elixir-autogen, elixir-format
msgid "If you did not submit this request, close this page. Nothing will be sent to support."
msgstr ""

View File

@ -49,7 +49,7 @@ msgstr "Categories"
#: lib/who_need_help_web/components/layouts.ex:95 #: lib/who_need_help_web/components/layouts.ex:95
#: lib/who_need_help_web/components/layouts.ex:168 #: lib/who_need_help_web/components/layouts.ex:168
#: lib/who_need_help_web/controllers/user_registration_html/new.html.heex:14 #: lib/who_need_help_web/controllers/user_registration_html/new.html.heex:14
#: lib/who_need_help_web/controllers/user_session_controller.ex:215 #: lib/who_need_help_web/controllers/user_session_controller.ex:225
#: lib/who_need_help_web/controllers/user_session_html/new.html.heex:10 #: lib/who_need_help_web/controllers/user_session_html/new.html.heex:10
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Log in" msgid "Log in"
@ -560,6 +560,8 @@ msgstr "Confirm your account and ensure it is active first."
msgid "Confirm your email and ensure your account is active before publishing." msgid "Confirm your email and ensure your account is active before publishing."
msgstr "Confirm your email and ensure your account is active before publishing." msgstr "Confirm your email and ensure your account is active before publishing."
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:27
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:22
#: lib/who_need_help_web/controllers/user_session_html/new.html.heex:57 #: lib/who_need_help_web/controllers/user_session_html/new.html.heex:57
#: lib/who_need_help_web/controllers/user_session_html/new.html.heex:63 #: lib/who_need_help_web/controllers/user_session_html/new.html.heex:63
#: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:20 #: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:20
@ -2520,6 +2522,8 @@ msgstr "Could not publish the request. Please try again."
msgid "Could not unblock this user. Please try again." msgid "Could not unblock this user. Please try again."
msgstr "Could not unblock this user. Please try again." msgstr "Could not unblock this user. Please try again."
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:40
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:35
#: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:27 #: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:27
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "JavaScript is required to confirm this protected email link." msgid "JavaScript is required to confirm this protected email link."
@ -3115,7 +3119,7 @@ msgid "Removal notice updated."
msgstr "Removal notice updated." msgstr "Removal notice updated."
#: lib/who_need_help_web/components/layouts.ex:201 #: lib/who_need_help_web/components/layouts.ex:201
#: lib/who_need_help_web/controllers/content_removal_controller.ex:136 #: lib/who_need_help_web/controllers/content_removal_controller.ex:151
#: lib/who_need_help_web/controllers/support_html/new.html.heex:16 #: lib/who_need_help_web/controllers/support_html/new.html.heex:16
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Report content" msgid "Report content"
@ -3131,7 +3135,7 @@ msgstr "Report illegal or harmful content"
msgid "Reported locations" msgid "Reported locations"
msgstr "Reported locations" msgstr "Reported locations"
#: lib/who_need_help_web/controllers/support_controller.ex:226 #: lib/who_need_help_web/controllers/support_controller.ex:241
#: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:6 #: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:6
#: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:42 #: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:42
#: lib/who_need_help_web/controllers/user_settings_html/edit.html.heex:128 #: lib/who_need_help_web/controllers/user_settings_html/edit.html.heex:128
@ -3249,7 +3253,7 @@ msgstr "Support request updated."
msgid "TAKE IT DOWN" msgid "TAKE IT DOWN"
msgstr "TAKE IT DOWN" msgstr "TAKE IT DOWN"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:135 #: lib/who_need_help_web/controllers/content_removal_controller.ex:150
#: lib/who_need_help_web/controllers/support_html/new.html.heex:19 #: lib/who_need_help_web/controllers/support_html/new.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "TAKE IT DOWN request" msgid "TAKE IT DOWN request"
@ -3277,7 +3281,7 @@ msgstr "This requests deletion of your Who Need Help account and associated pers
msgid "Threat to life or safety" msgid "Threat to life or safety"
msgstr "Threat to life or safety" msgstr "Threat to life or safety"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:103 #: lib/who_need_help_web/controllers/content_removal_controller.ex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Too many removal notices. Please try again later." msgid "Too many removal notices. Please try again later."
msgstr "Too many removal notices. Please try again later." msgstr "Too many removal notices. Please try again later."
@ -3757,7 +3761,7 @@ msgstr "Creating account..."
msgid "Email me a verification link" msgid "Email me a verification link"
msgstr "Email me a verification link" msgstr "Email me a verification link"
#: lib/who_need_help_web/controllers/user_session_controller.ex:183 #: lib/who_need_help_web/controllers/user_session_controller.ex:193
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Google sign-in connected. You can use it next time." msgid "Google sign-in connected. You can use it next time."
msgstr "Google sign-in connected. You can use it next time." msgstr "Google sign-in connected. You can use it next time."
@ -3809,7 +3813,7 @@ msgstr "Verified"
msgid "We sent a verification link to %{email}. Open it to finish connecting Google." msgid "We sent a verification link to %{email}. Open it to finish connecting Google."
msgstr "We sent a verification link to %{email}. Open it to finish connecting Google." msgstr "We sent a verification link to %{email}. Open it to finish connecting Google."
#: lib/who_need_help_web/controllers/user_session_controller.ex:196 #: lib/who_need_help_web/controllers/user_session_controller.ex:206
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "You are signed in, but Google could not be connected. Try again in account settings." msgid "You are signed in, but Google could not be connected. Try again in account settings."
msgstr "You are signed in, but Google could not be connected. Try again in account settings." msgstr "You are signed in, but Google could not be connected. Try again in account settings."
@ -5242,7 +5246,7 @@ msgid "Case status"
msgstr "Case status" msgstr "Case status"
#: lib/who_need_help_web/controllers/page_html/child_safety.html.heex:42 #: lib/who_need_help_web/controllers/page_html/child_safety.html.heex:42
#: lib/who_need_help_web/controllers/support_controller.ex:227 #: lib/who_need_help_web/controllers/support_controller.ex:242
#: lib/who_need_help_web/live/report_live.ex:50 #: lib/who_need_help_web/live/report_live.ex:50
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Contact support" msgid "Contact support"
@ -5253,7 +5257,7 @@ msgstr "Contact support"
msgid "Content-removal notice %{reference}" msgid "Content-removal notice %{reference}"
msgstr "Content-removal notice %{reference}" msgstr "Content-removal notice %{reference}"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:111 #: lib/who_need_help_web/controllers/content_removal_controller.ex:126
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Content-removal notice received" msgid "Content-removal notice received"
msgstr "Content-removal notice received" msgstr "Content-removal notice received"
@ -5264,8 +5268,8 @@ msgstr "Content-removal notice received"
msgid "Conversation" msgid "Conversation"
msgstr "Conversation" msgstr "Conversation"
#: lib/who_need_help_web/controllers/support_controller.ex:137 #: lib/who_need_help_web/controllers/support_controller.ex:152
#: lib/who_need_help_web/controllers/support_controller.ex:153 #: lib/who_need_help_web/controllers/support_controller.ex:168
#: lib/who_need_help_web/live/support_case_live.ex:73 #: lib/who_need_help_web/live/support_case_live.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not send your message. Please check it and try again." msgid "Could not send your message. Please check it and try again."
@ -5328,7 +5332,7 @@ msgstr "No reports submitted"
msgid "No status history is available for this older case." msgid "No status history is available for this older case."
msgstr "No status history is available for this older case." msgstr "No status history is available for this older case."
#: lib/who_need_help_web/controllers/support_controller.ex:172 #: lib/who_need_help_web/controllers/support_controller.ex:187
#: lib/who_need_help_web/live/support_case_live.ex:95 #: lib/who_need_help_web/live/support_case_live.ex:95
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Only a resolved or closed request can be reopened." msgid "Only a resolved or closed request can be reopened."
@ -5438,7 +5442,7 @@ msgstr "Status history"
msgid "Support request created" msgid "Support request created"
msgstr "Support request created" msgstr "Support request created"
#: lib/who_need_help_web/controllers/support_controller.ex:183 #: lib/who_need_help_web/controllers/support_controller.ex:198
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Support request received" msgid "Support request received"
msgstr "Support request received" msgstr "Support request received"
@ -5474,7 +5478,7 @@ msgstr "TRUST AND SAFETY"
msgid "The requester states whether the medicine is paid, reserved, or still needs to be purchased." msgid "The requester states whether the medicine is paid, reserved, or still needs to be purchased."
msgstr "The requester states whether the medicine is paid, reserved, or still needs to be purchased." msgstr "The requester states whether the medicine is paid, reserved, or still needs to be purchased."
#: lib/who_need_help_web/controllers/support_controller.ex:167 #: lib/who_need_help_web/controllers/support_controller.ex:182
#: lib/who_need_help_web/live/support_case_live.ex:88 #: lib/who_need_help_web/live/support_case_live.ex:88
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "The support request is open again." msgid "The support request is open again."
@ -5502,7 +5506,7 @@ msgstr "This private history shows reports you submitted and the latest moderati
msgid "This support request is no longer available." msgid "This support request is no longer available."
msgstr "This support request is no longer available." msgstr "This support request is no longer available."
#: lib/who_need_help_web/controllers/support_controller.ex:143 #: lib/who_need_help_web/controllers/support_controller.ex:158
#: lib/who_need_help_web/live/support_case_live.ex:60 #: lib/who_need_help_web/live/support_case_live.ex:60
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Too many messages. Please try again later." msgid "Too many messages. Please try again later."
@ -5539,7 +5543,7 @@ msgstr "You"
msgid "Your content-removal notices" msgid "Your content-removal notices"
msgstr "Your content-removal notices" msgstr "Your content-removal notices"
#: lib/who_need_help_web/controllers/support_controller.ex:130 #: lib/who_need_help_web/controllers/support_controller.ex:145
#: lib/who_need_help_web/live/support_case_live.ex:53 #: lib/who_need_help_web/live/support_case_live.ex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your message was sent to support." msgid "Your message was sent to support."
@ -7677,12 +7681,12 @@ msgstr "You do not have permission for this action."
msgid "You do not have permission for this action. Role changes also require a recent sign-in." msgid "You do not have permission for this action. Role changes also require a recent sign-in."
msgstr "You do not have permission for this action. Role changes also require a recent sign-in." msgstr "You do not have permission for this action. Role changes also require a recent sign-in."
#: lib/who_need_help_web/controllers/content_removal_controller.ex:70 #: lib/who_need_help_web/controllers/content_removal_controller.ex:85
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your email was confirmed and the notice was sent for review." msgid "Your email was confirmed and the notice was sent for review."
msgstr "Your email was confirmed and the notice was sent for review." msgstr "Your email was confirmed and the notice was sent for review."
#: lib/who_need_help_web/controllers/support_controller.ex:107 #: lib/who_need_help_web/controllers/support_controller.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your email was confirmed and the request was sent to support." msgid "Your email was confirmed and the request was sent to support."
msgstr "Your email was confirmed and the request was sent to support." msgstr "Your email was confirmed and the request was sent to support."
@ -7872,3 +7876,37 @@ msgstr "Enable Android notifications"
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Copy and paste this secure address into your browser:" msgid "Copy and paste this secure address into your browser:"
msgstr "Copy and paste this secure address into your browser:" msgstr "Copy and paste this secure address into your browser:"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:69
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:9
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:28
#, elixir-autogen, elixir-format
msgid "Confirm content-removal notice"
msgstr "Confirm content-removal notice"
#: lib/who_need_help_web/controllers/support_controller.ex:106
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:9
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:23
#, elixir-autogen, elixir-format
msgid "Confirm support request"
msgstr "Confirm support request"
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:11
#, elixir-autogen, elixir-format
msgid "Confirm that you submitted this notice before it is sent for review."
msgstr "Confirm that you submitted this notice before it is sent for review."
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:11
#, elixir-autogen, elixir-format
msgid "Confirm that you submitted this request before it is sent to support."
msgstr "Confirm that you submitted this request before it is sent to support."
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:33
#, elixir-autogen, elixir-format
msgid "If you did not submit this notice, close this page. Nothing will be sent for review."
msgstr "If you did not submit this notice, close this page. Nothing will be sent for review."
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:28
#, elixir-autogen, elixir-format
msgid "If you did not submit this request, close this page. Nothing will be sent to support."
msgstr "If you did not submit this request, close this page. Nothing will be sent to support."

View File

@ -49,7 +49,7 @@ msgstr "Категории"
#: lib/who_need_help_web/components/layouts.ex:95 #: lib/who_need_help_web/components/layouts.ex:95
#: lib/who_need_help_web/components/layouts.ex:168 #: lib/who_need_help_web/components/layouts.ex:168
#: lib/who_need_help_web/controllers/user_registration_html/new.html.heex:14 #: lib/who_need_help_web/controllers/user_registration_html/new.html.heex:14
#: lib/who_need_help_web/controllers/user_session_controller.ex:215 #: lib/who_need_help_web/controllers/user_session_controller.ex:225
#: lib/who_need_help_web/controllers/user_session_html/new.html.heex:10 #: lib/who_need_help_web/controllers/user_session_html/new.html.heex:10
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Log in" msgid "Log in"
@ -580,6 +580,8 @@ msgstr ""
"Перед публикацией подтвердите электронную почту и убедитесь, что учётная " "Перед публикацией подтвердите электронную почту и убедитесь, что учётная "
"запись активна." "запись активна."
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:27
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:22
#: lib/who_need_help_web/controllers/user_session_html/new.html.heex:57 #: lib/who_need_help_web/controllers/user_session_html/new.html.heex:57
#: lib/who_need_help_web/controllers/user_session_html/new.html.heex:63 #: lib/who_need_help_web/controllers/user_session_html/new.html.heex:63
#: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:20 #: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:20
@ -2636,6 +2638,8 @@ msgstr "Не удалось опубликовать заявку. Попроб
msgid "Could not unblock this user. Please try again." msgid "Could not unblock this user. Please try again."
msgstr "Не удалось разблокировать пользователя. Попробуйте ещё раз." msgstr "Не удалось разблокировать пользователя. Попробуйте ещё раз."
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:40
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:35
#: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:27 #: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:27
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "JavaScript is required to confirm this protected email link." msgid "JavaScript is required to confirm this protected email link."
@ -3231,7 +3235,7 @@ msgid "Removal notice updated."
msgstr "Уведомление об удалении обновлено." msgstr "Уведомление об удалении обновлено."
#: lib/who_need_help_web/components/layouts.ex:201 #: lib/who_need_help_web/components/layouts.ex:201
#: lib/who_need_help_web/controllers/content_removal_controller.ex:136 #: lib/who_need_help_web/controllers/content_removal_controller.ex:151
#: lib/who_need_help_web/controllers/support_html/new.html.heex:16 #: lib/who_need_help_web/controllers/support_html/new.html.heex:16
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Report content" msgid "Report content"
@ -3247,7 +3251,7 @@ msgstr "Сообщить о незаконном или вредоносном
msgid "Reported locations" msgid "Reported locations"
msgstr "Указанные адреса контента" msgstr "Указанные адреса контента"
#: lib/who_need_help_web/controllers/support_controller.ex:226 #: lib/who_need_help_web/controllers/support_controller.ex:241
#: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:6 #: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:6
#: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:42 #: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:42
#: lib/who_need_help_web/controllers/user_settings_html/edit.html.heex:128 #: lib/who_need_help_web/controllers/user_settings_html/edit.html.heex:128
@ -3365,7 +3369,7 @@ msgstr "Обращение в поддержку обновлено."
msgid "TAKE IT DOWN" msgid "TAKE IT DOWN"
msgstr "TAKE IT DOWN" msgstr "TAKE IT DOWN"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:135 #: lib/who_need_help_web/controllers/content_removal_controller.ex:150
#: lib/who_need_help_web/controllers/support_html/new.html.heex:19 #: lib/who_need_help_web/controllers/support_html/new.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "TAKE IT DOWN request" msgid "TAKE IT DOWN request"
@ -3393,7 +3397,7 @@ msgstr "Это запрос на удаление аккаунта Who Need Help
msgid "Threat to life or safety" msgid "Threat to life or safety"
msgstr "Угроза жизни или безопасности" msgstr "Угроза жизни или безопасности"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:103 #: lib/who_need_help_web/controllers/content_removal_controller.ex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Too many removal notices. Please try again later." msgid "Too many removal notices. Please try again later."
msgstr "Слишком много уведомлений об удалении. Повторите попытку позже." msgstr "Слишком много уведомлений об удалении. Повторите попытку позже."
@ -3873,7 +3877,7 @@ msgstr "Создаём аккаунт..."
msgid "Email me a verification link" msgid "Email me a verification link"
msgstr "Отправить ссылку для подтверждения на email" msgstr "Отправить ссылку для подтверждения на email"
#: lib/who_need_help_web/controllers/user_session_controller.ex:183 #: lib/who_need_help_web/controllers/user_session_controller.ex:193
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Google sign-in connected. You can use it next time." msgid "Google sign-in connected. You can use it next time."
msgstr "Вход через Google подключён. В следующий раз можно использовать его." msgstr "Вход через Google подключён. В следующий раз можно использовать его."
@ -3925,7 +3929,7 @@ msgstr "Подтверждено"
msgid "We sent a verification link to %{email}. Open it to finish connecting Google." msgid "We sent a verification link to %{email}. Open it to finish connecting Google."
msgstr "Мы отправили ссылку для подтверждения на %{email}. Откройте её, чтобы завершить подключение Google." msgstr "Мы отправили ссылку для подтверждения на %{email}. Откройте её, чтобы завершить подключение Google."
#: lib/who_need_help_web/controllers/user_session_controller.ex:196 #: lib/who_need_help_web/controllers/user_session_controller.ex:206
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "You are signed in, but Google could not be connected. Try again in account settings." msgid "You are signed in, but Google could not be connected. Try again in account settings."
msgstr "Вы вошли, но подключить Google не удалось. Повторите попытку в настройках аккаунта." msgstr "Вы вошли, но подключить Google не удалось. Повторите попытку в настройках аккаунта."
@ -5359,7 +5363,7 @@ msgid "Case status"
msgstr "Статус обращения" msgstr "Статус обращения"
#: lib/who_need_help_web/controllers/page_html/child_safety.html.heex:42 #: lib/who_need_help_web/controllers/page_html/child_safety.html.heex:42
#: lib/who_need_help_web/controllers/support_controller.ex:227 #: lib/who_need_help_web/controllers/support_controller.ex:242
#: lib/who_need_help_web/live/report_live.ex:50 #: lib/who_need_help_web/live/report_live.ex:50
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Contact support" msgid "Contact support"
@ -5370,7 +5374,7 @@ msgstr "Обратиться в поддержку"
msgid "Content-removal notice %{reference}" msgid "Content-removal notice %{reference}"
msgstr "Уведомление об удалении контента %{reference}" msgstr "Уведомление об удалении контента %{reference}"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:111 #: lib/who_need_help_web/controllers/content_removal_controller.ex:126
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Content-removal notice received" msgid "Content-removal notice received"
msgstr "Уведомление об удалении контента получено" msgstr "Уведомление об удалении контента получено"
@ -5381,8 +5385,8 @@ msgstr "Уведомление об удалении контента получ
msgid "Conversation" msgid "Conversation"
msgstr "Переписка" msgstr "Переписка"
#: lib/who_need_help_web/controllers/support_controller.ex:137 #: lib/who_need_help_web/controllers/support_controller.ex:152
#: lib/who_need_help_web/controllers/support_controller.ex:153 #: lib/who_need_help_web/controllers/support_controller.ex:168
#: lib/who_need_help_web/live/support_case_live.ex:73 #: lib/who_need_help_web/live/support_case_live.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not send your message. Please check it and try again." msgid "Could not send your message. Please check it and try again."
@ -5445,7 +5449,7 @@ msgstr "Жалоб не отправлено"
msgid "No status history is available for this older case." msgid "No status history is available for this older case."
msgstr "Для этого старого обращения история статусов недоступна." msgstr "Для этого старого обращения история статусов недоступна."
#: lib/who_need_help_web/controllers/support_controller.ex:172 #: lib/who_need_help_web/controllers/support_controller.ex:187
#: lib/who_need_help_web/live/support_case_live.ex:95 #: lib/who_need_help_web/live/support_case_live.ex:95
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Only a resolved or closed request can be reopened." msgid "Only a resolved or closed request can be reopened."
@ -5555,7 +5559,7 @@ msgstr "История статусов"
msgid "Support request created" msgid "Support request created"
msgstr "Обращение в поддержку создано" msgstr "Обращение в поддержку создано"
#: lib/who_need_help_web/controllers/support_controller.ex:183 #: lib/who_need_help_web/controllers/support_controller.ex:198
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Support request received" msgid "Support request received"
msgstr "Обращение в поддержку получено" msgstr "Обращение в поддержку получено"
@ -5591,7 +5595,7 @@ msgstr "ДОВЕРИЕ И БЕЗОПАСНОСТЬ"
msgid "The requester states whether the medicine is paid, reserved, or still needs to be purchased." msgid "The requester states whether the medicine is paid, reserved, or still needs to be purchased."
msgstr "Автор заявки указывает, оплачено ли лекарство, зарезервировано или его ещё нужно купить." msgstr "Автор заявки указывает, оплачено ли лекарство, зарезервировано или его ещё нужно купить."
#: lib/who_need_help_web/controllers/support_controller.ex:167 #: lib/who_need_help_web/controllers/support_controller.ex:182
#: lib/who_need_help_web/live/support_case_live.ex:88 #: lib/who_need_help_web/live/support_case_live.ex:88
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "The support request is open again." msgid "The support request is open again."
@ -5619,7 +5623,7 @@ msgstr "В этой личной истории показаны ваши жал
msgid "This support request is no longer available." msgid "This support request is no longer available."
msgstr "Это обращение в поддержку больше недоступно." msgstr "Это обращение в поддержку больше недоступно."
#: lib/who_need_help_web/controllers/support_controller.ex:143 #: lib/who_need_help_web/controllers/support_controller.ex:158
#: lib/who_need_help_web/live/support_case_live.ex:60 #: lib/who_need_help_web/live/support_case_live.ex:60
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Too many messages. Please try again later." msgid "Too many messages. Please try again later."
@ -5656,7 +5660,7 @@ msgstr "Вы"
msgid "Your content-removal notices" msgid "Your content-removal notices"
msgstr "Ваши уведомления об удалении контента" msgstr "Ваши уведомления об удалении контента"
#: lib/who_need_help_web/controllers/support_controller.ex:130 #: lib/who_need_help_web/controllers/support_controller.ex:145
#: lib/who_need_help_web/live/support_case_live.ex:53 #: lib/who_need_help_web/live/support_case_live.ex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your message was sent to support." msgid "Your message was sent to support."
@ -7797,12 +7801,12 @@ msgstr "У вас нет разрешения на это действие."
msgid "You do not have permission for this action. Role changes also require a recent sign-in." msgid "You do not have permission for this action. Role changes also require a recent sign-in."
msgstr "У вас нет разрешения на это действие. Для изменения ролей также требуется недавний вход." msgstr "У вас нет разрешения на это действие. Для изменения ролей также требуется недавний вход."
#: lib/who_need_help_web/controllers/content_removal_controller.ex:70 #: lib/who_need_help_web/controllers/content_removal_controller.ex:85
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your email was confirmed and the notice was sent for review." msgid "Your email was confirmed and the notice was sent for review."
msgstr "Ваш email подтверждён, уведомление отправлено на проверку." msgstr "Ваш email подтверждён, уведомление отправлено на проверку."
#: lib/who_need_help_web/controllers/support_controller.ex:107 #: lib/who_need_help_web/controllers/support_controller.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your email was confirmed and the request was sent to support." msgid "Your email was confirmed and the request was sent to support."
msgstr "Ваш email подтверждён, обращение отправлено в поддержку." msgstr "Ваш email подтверждён, обращение отправлено в поддержку."
@ -7992,3 +7996,37 @@ msgstr "Включить уведомления Android"
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Copy and paste this secure address into your browser:" msgid "Copy and paste this secure address into your browser:"
msgstr "Скопируйте этот безопасный адрес и вставьте его в браузер:" msgstr "Скопируйте этот безопасный адрес и вставьте его в браузер:"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:69
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:9
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:28
#, elixir-autogen, elixir-format
msgid "Confirm content-removal notice"
msgstr "Подтвердить уведомление об удалении контента"
#: lib/who_need_help_web/controllers/support_controller.ex:106
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:9
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:23
#, elixir-autogen, elixir-format
msgid "Confirm support request"
msgstr "Подтвердить обращение в поддержку"
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:11
#, elixir-autogen, elixir-format
msgid "Confirm that you submitted this notice before it is sent for review."
msgstr "Подтвердите, что это уведомление отправили вы, прежде чем оно поступит на рассмотрение."
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:11
#, elixir-autogen, elixir-format
msgid "Confirm that you submitted this request before it is sent to support."
msgstr "Подтвердите, что это обращение отправили вы, прежде чем оно поступит в поддержку."
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:33
#, elixir-autogen, elixir-format
msgid "If you did not submit this notice, close this page. Nothing will be sent for review."
msgstr "Если вы не отправляли это уведомление, закройте страницу. На рассмотрение ничего не поступит."
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:28
#, elixir-autogen, elixir-format
msgid "If you did not submit this request, close this page. Nothing will be sent to support."
msgstr "Если вы не отправляли это обращение, закройте страницу. В поддержку ничего не поступит."

View File

@ -49,7 +49,7 @@ msgstr "Категорії"
#: lib/who_need_help_web/components/layouts.ex:95 #: lib/who_need_help_web/components/layouts.ex:95
#: lib/who_need_help_web/components/layouts.ex:168 #: lib/who_need_help_web/components/layouts.ex:168
#: lib/who_need_help_web/controllers/user_registration_html/new.html.heex:14 #: lib/who_need_help_web/controllers/user_registration_html/new.html.heex:14
#: lib/who_need_help_web/controllers/user_session_controller.ex:215 #: lib/who_need_help_web/controllers/user_session_controller.ex:225
#: lib/who_need_help_web/controllers/user_session_html/new.html.heex:10 #: lib/who_need_help_web/controllers/user_session_html/new.html.heex:10
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Log in" msgid "Log in"
@ -581,6 +581,8 @@ msgstr ""
"Перед публікацією підтвердьте електронну пошту й переконайтеся, що обліковий" "Перед публікацією підтвердьте електронну пошту й переконайтеся, що обліковий"
" запис активний." " запис активний."
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:27
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:22
#: lib/who_need_help_web/controllers/user_session_html/new.html.heex:57 #: lib/who_need_help_web/controllers/user_session_html/new.html.heex:57
#: lib/who_need_help_web/controllers/user_session_html/new.html.heex:63 #: lib/who_need_help_web/controllers/user_session_html/new.html.heex:63
#: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:20 #: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:20
@ -2630,6 +2632,8 @@ msgstr "Не вдалося опублікувати заявку. Спробу
msgid "Could not unblock this user. Please try again." msgid "Could not unblock this user. Please try again."
msgstr "Не вдалося розблокувати користувача. Спробуйте ще раз." msgstr "Не вдалося розблокувати користувача. Спробуйте ще раз."
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:40
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:35
#: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:27 #: lib/who_need_help_web/controllers/user_settings_html/confirm_email.html.heex:27
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "JavaScript is required to confirm this protected email link." msgid "JavaScript is required to confirm this protected email link."
@ -3225,7 +3229,7 @@ msgid "Removal notice updated."
msgstr "Повідомлення про видалення оновлено." msgstr "Повідомлення про видалення оновлено."
#: lib/who_need_help_web/components/layouts.ex:201 #: lib/who_need_help_web/components/layouts.ex:201
#: lib/who_need_help_web/controllers/content_removal_controller.ex:136 #: lib/who_need_help_web/controllers/content_removal_controller.ex:151
#: lib/who_need_help_web/controllers/support_html/new.html.heex:16 #: lib/who_need_help_web/controllers/support_html/new.html.heex:16
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Report content" msgid "Report content"
@ -3241,7 +3245,7 @@ msgstr "Повідомити про незаконний або шкідливи
msgid "Reported locations" msgid "Reported locations"
msgstr "Указані адреси контенту" msgstr "Указані адреси контенту"
#: lib/who_need_help_web/controllers/support_controller.ex:226 #: lib/who_need_help_web/controllers/support_controller.ex:241
#: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:6 #: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:6
#: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:42 #: lib/who_need_help_web/controllers/support_html/delete_account.html.heex:42
#: lib/who_need_help_web/controllers/user_settings_html/edit.html.heex:128 #: lib/who_need_help_web/controllers/user_settings_html/edit.html.heex:128
@ -3359,7 +3363,7 @@ msgstr "Звернення до підтримки оновлено."
msgid "TAKE IT DOWN" msgid "TAKE IT DOWN"
msgstr "TAKE IT DOWN" msgstr "TAKE IT DOWN"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:135 #: lib/who_need_help_web/controllers/content_removal_controller.ex:150
#: lib/who_need_help_web/controllers/support_html/new.html.heex:19 #: lib/who_need_help_web/controllers/support_html/new.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "TAKE IT DOWN request" msgid "TAKE IT DOWN request"
@ -3387,7 +3391,7 @@ msgstr "Це запит на видалення облікового запис
msgid "Threat to life or safety" msgid "Threat to life or safety"
msgstr "Загроза життю або безпеці" msgstr "Загроза життю або безпеці"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:103 #: lib/who_need_help_web/controllers/content_removal_controller.ex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Too many removal notices. Please try again later." msgid "Too many removal notices. Please try again later."
msgstr "Забагато повідомлень про видалення. Спробуйте пізніше." msgstr "Забагато повідомлень про видалення. Спробуйте пізніше."
@ -3867,7 +3871,7 @@ msgstr "Створюємо обліковий запис..."
msgid "Email me a verification link" msgid "Email me a verification link"
msgstr "Надіслати посилання для підтвердження на email" msgstr "Надіслати посилання для підтвердження на email"
#: lib/who_need_help_web/controllers/user_session_controller.ex:183 #: lib/who_need_help_web/controllers/user_session_controller.ex:193
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Google sign-in connected. You can use it next time." msgid "Google sign-in connected. You can use it next time."
msgstr "Вхід через Google підключено. Наступного разу можна скористатися ним." msgstr "Вхід через Google підключено. Наступного разу можна скористатися ним."
@ -3919,7 +3923,7 @@ msgstr "Підтверджено"
msgid "We sent a verification link to %{email}. Open it to finish connecting Google." msgid "We sent a verification link to %{email}. Open it to finish connecting Google."
msgstr "Ми надіслали посилання для підтвердження на %{email}. Відкрийте його, щоб завершити підключення Google." msgstr "Ми надіслали посилання для підтвердження на %{email}. Відкрийте його, щоб завершити підключення Google."
#: lib/who_need_help_web/controllers/user_session_controller.ex:196 #: lib/who_need_help_web/controllers/user_session_controller.ex:206
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "You are signed in, but Google could not be connected. Try again in account settings." msgid "You are signed in, but Google could not be connected. Try again in account settings."
msgstr "Ви ввійшли, але підключити Google не вдалося. Повторіть спробу в налаштуваннях облікового запису." msgstr "Ви ввійшли, але підключити Google не вдалося. Повторіть спробу в налаштуваннях облікового запису."
@ -5353,7 +5357,7 @@ msgid "Case status"
msgstr "Статус звернення" msgstr "Статус звернення"
#: lib/who_need_help_web/controllers/page_html/child_safety.html.heex:42 #: lib/who_need_help_web/controllers/page_html/child_safety.html.heex:42
#: lib/who_need_help_web/controllers/support_controller.ex:227 #: lib/who_need_help_web/controllers/support_controller.ex:242
#: lib/who_need_help_web/live/report_live.ex:50 #: lib/who_need_help_web/live/report_live.ex:50
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Contact support" msgid "Contact support"
@ -5364,7 +5368,7 @@ msgstr "Звернутися до підтримки"
msgid "Content-removal notice %{reference}" msgid "Content-removal notice %{reference}"
msgstr "Повідомлення про видалення контенту %{reference}" msgstr "Повідомлення про видалення контенту %{reference}"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:111 #: lib/who_need_help_web/controllers/content_removal_controller.ex:126
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Content-removal notice received" msgid "Content-removal notice received"
msgstr "Повідомлення про видалення контенту отримано" msgstr "Повідомлення про видалення контенту отримано"
@ -5375,8 +5379,8 @@ msgstr "Повідомлення про видалення контенту от
msgid "Conversation" msgid "Conversation"
msgstr "Розмова" msgstr "Розмова"
#: lib/who_need_help_web/controllers/support_controller.ex:137 #: lib/who_need_help_web/controllers/support_controller.ex:152
#: lib/who_need_help_web/controllers/support_controller.ex:153 #: lib/who_need_help_web/controllers/support_controller.ex:168
#: lib/who_need_help_web/live/support_case_live.ex:73 #: lib/who_need_help_web/live/support_case_live.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not send your message. Please check it and try again." msgid "Could not send your message. Please check it and try again."
@ -5439,7 +5443,7 @@ msgstr "Скарг не подано"
msgid "No status history is available for this older case." msgid "No status history is available for this older case."
msgstr "Для цього старого звернення історія статусів недоступна." msgstr "Для цього старого звернення історія статусів недоступна."
#: lib/who_need_help_web/controllers/support_controller.ex:172 #: lib/who_need_help_web/controllers/support_controller.ex:187
#: lib/who_need_help_web/live/support_case_live.ex:95 #: lib/who_need_help_web/live/support_case_live.ex:95
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Only a resolved or closed request can be reopened." msgid "Only a resolved or closed request can be reopened."
@ -5549,7 +5553,7 @@ msgstr "Історія статусів"
msgid "Support request created" msgid "Support request created"
msgstr "Звернення до підтримки створено" msgstr "Звернення до підтримки створено"
#: lib/who_need_help_web/controllers/support_controller.ex:183 #: lib/who_need_help_web/controllers/support_controller.ex:198
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Support request received" msgid "Support request received"
msgstr "Звернення до підтримки отримано" msgstr "Звернення до підтримки отримано"
@ -5585,7 +5589,7 @@ msgstr "ДОВІРА ТА БЕЗПЕКА"
msgid "The requester states whether the medicine is paid, reserved, or still needs to be purchased." msgid "The requester states whether the medicine is paid, reserved, or still needs to be purchased."
msgstr "Автор заявки вказує, чи ліки вже оплачені, зарезервовані або їх ще потрібно придбати." msgstr "Автор заявки вказує, чи ліки вже оплачені, зарезервовані або їх ще потрібно придбати."
#: lib/who_need_help_web/controllers/support_controller.ex:167 #: lib/who_need_help_web/controllers/support_controller.ex:182
#: lib/who_need_help_web/live/support_case_live.ex:88 #: lib/who_need_help_web/live/support_case_live.ex:88
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "The support request is open again." msgid "The support request is open again."
@ -5613,7 +5617,7 @@ msgstr "У цій приватній історії показано ваші с
msgid "This support request is no longer available." msgid "This support request is no longer available."
msgstr "Це звернення до підтримки більше не доступне." msgstr "Це звернення до підтримки більше не доступне."
#: lib/who_need_help_web/controllers/support_controller.ex:143 #: lib/who_need_help_web/controllers/support_controller.ex:158
#: lib/who_need_help_web/live/support_case_live.ex:60 #: lib/who_need_help_web/live/support_case_live.ex:60
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Too many messages. Please try again later." msgid "Too many messages. Please try again later."
@ -5650,7 +5654,7 @@ msgstr "Ви"
msgid "Your content-removal notices" msgid "Your content-removal notices"
msgstr "Ваші повідомлення про видалення контенту" msgstr "Ваші повідомлення про видалення контенту"
#: lib/who_need_help_web/controllers/support_controller.ex:130 #: lib/who_need_help_web/controllers/support_controller.ex:145
#: lib/who_need_help_web/live/support_case_live.ex:53 #: lib/who_need_help_web/live/support_case_live.ex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your message was sent to support." msgid "Your message was sent to support."
@ -7791,12 +7795,12 @@ msgstr "У вас немає дозволу на цю дію."
msgid "You do not have permission for this action. Role changes also require a recent sign-in." msgid "You do not have permission for this action. Role changes also require a recent sign-in."
msgstr "У вас немає дозволу на цю дію. Для зміни ролей також потрібен нещодавній вхід." msgstr "У вас немає дозволу на цю дію. Для зміни ролей також потрібен нещодавній вхід."
#: lib/who_need_help_web/controllers/content_removal_controller.ex:70 #: lib/who_need_help_web/controllers/content_removal_controller.ex:85
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your email was confirmed and the notice was sent for review." msgid "Your email was confirmed and the notice was sent for review."
msgstr "Ваш email підтверджено, повідомлення надіслано на перевірку." msgstr "Ваш email підтверджено, повідомлення надіслано на перевірку."
#: lib/who_need_help_web/controllers/support_controller.ex:107 #: lib/who_need_help_web/controllers/support_controller.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your email was confirmed and the request was sent to support." msgid "Your email was confirmed and the request was sent to support."
msgstr "Ваш email підтверджено, звернення надіслано до підтримки." msgstr "Ваш email підтверджено, звернення надіслано до підтримки."
@ -7986,3 +7990,37 @@ msgstr "Увімкнути сповіщення Android"
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Copy and paste this secure address into your browser:" msgid "Copy and paste this secure address into your browser:"
msgstr "Скопіюйте цю безпечну адресу та вставте її у браузер:" msgstr "Скопіюйте цю безпечну адресу та вставте її у браузер:"
#: lib/who_need_help_web/controllers/content_removal_controller.ex:69
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:9
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:28
#, elixir-autogen, elixir-format
msgid "Confirm content-removal notice"
msgstr "Підтвердити повідомлення про видалення контенту"
#: lib/who_need_help_web/controllers/support_controller.ex:106
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:9
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:23
#, elixir-autogen, elixir-format
msgid "Confirm support request"
msgstr "Підтвердити звернення до підтримки"
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:11
#, elixir-autogen, elixir-format
msgid "Confirm that you submitted this notice before it is sent for review."
msgstr "Підтвердьте, що це повідомлення надіслали ви, перш ніж воно надійде на розгляд."
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:11
#, elixir-autogen, elixir-format
msgid "Confirm that you submitted this request before it is sent to support."
msgstr "Підтвердьте, що це звернення надіслали ви, перш ніж воно надійде до підтримки."
#: lib/who_need_help_web/controllers/content_removal_html/verify.html.heex:33
#, elixir-autogen, elixir-format
msgid "If you did not submit this notice, close this page. Nothing will be sent for review."
msgstr "Якщо ви не надсилали це повідомлення, закрийте сторінку. На розгляд нічого не надійде."
#: lib/who_need_help_web/controllers/support_html/verify.html.heex:28
#, elixir-autogen, elixir-format
msgid "If you did not submit this request, close this page. Nothing will be sent to support."
msgstr "Якщо ви не надсилали це звернення, закрийте сторінку. До підтримки нічого не надійде."

View File

@ -47,7 +47,8 @@ defmodule WhoNeedHelp.SupportAndContentRemovalTest do
assert_email_sent(fn email -> assert_email_sent(fn email ->
matches_request = matches_request =
email.subject =~ request.reference and email.subject =~ request.reference and
email.text_body =~ "/support/cases/#{request.id}/verify?token=" email.text_body =~ "/support/cases/#{request.id}/verify#token=" and
not String.contains?(email.text_body, "/verify?token=")
if matches_request, do: send(test_pid, {:support_acknowledgement, email}) if matches_request, do: send(test_pid, {:support_acknowledgement, email})
matches_request matches_request
@ -57,14 +58,14 @@ defmodule WhoNeedHelp.SupportAndContentRemovalTest do
[confirmation_url] = [confirmation_url] =
Regex.run( Regex.run(
~r{https?://[^\s]+/support/cases/#{Regex.escape(request.id)}/verify\?token=[^\s]+}, ~r{https?://[^\s]+/support/cases/#{Regex.escape(request.id)}/verify#token=[^\s]+},
email.text_body email.text_body
) )
confirmation_token = confirmation_token =
confirmation_url confirmation_url
|> URI.parse() |> URI.parse()
|> Map.fetch!(:query) |> Map.fetch!(:fragment)
|> URI.decode_query() |> URI.decode_query()
|> Map.fetch!("token") |> Map.fetch!("token")
@ -657,7 +658,9 @@ defmodule WhoNeedHelp.SupportAndContentRemovalTest do
assert_email_sent(fn email -> assert_email_sent(fn email ->
email.subject =~ "Confirm Who Need Help removal notice" and email.subject =~ "Confirm Who Need Help removal notice" and
email.text_body =~ notice.reference and email.text_body =~ notice.reference and
email.text_body =~ "has not been added to the staff review queue yet" email.text_body =~ "has not been added to the staff review queue yet" and
email.text_body =~ "/legal/content-removal/#{notice.id}/verify#token=" and
not String.contains?(email.text_body, "/verify?token=")
end) end)
moderator_scope = moderator_scope() moderator_scope = moderator_scope()

View File

@ -171,7 +171,7 @@ defmodule WhoNeedHelpWeb.SupportControllerTest do
assert_email_sent() assert_email_sent()
end end
test "confirmation endpoints exchange short-lived confirmation links for status links", %{ test "confirmation pages require an explicit POST before exposing cases to staff", %{
conn: conn conn: conn
} do } do
assert {:ok, support_request} = assert {:ok, support_request} =
@ -183,10 +183,37 @@ defmodule WhoNeedHelpWeb.SupportControllerTest do
"The confirmation endpoint must redirect to a separate private status link." "The confirmation endpoint must redirect to a separate private status link."
}) })
support_conn = support_token = WhoNeedHelp.Support.confirmation_token(support_request)
support_page =
get( get(
conn, conn,
~p"/support/cases/#{support_request.id}/verify?token=#{WhoNeedHelp.Support.confirmation_token(support_request)}" ~p"/support/cases/#{support_request.id}/verify?token=#{support_token}"
)
support_html = html_response(support_page, 200)
assert support_html =~ "Confirm support request"
assert support_html =~ ~s(id="support-confirmation-fragment-form")
assert support_html =~ ~s(id="support-confirmation-fragment-token")
refute support_html =~ support_token
refute Repo.get!(SupportRequest, support_request.id).contact_verified_at
assert response(
post(
recycle(support_page),
~p"/support/cases/#{support_request.id}/verify",
%{}
),
404
)
refute Repo.get!(SupportRequest, support_request.id).contact_verified_at
support_conn =
post(
recycle(support_page),
~p"/support/cases/#{support_request.id}/verify",
%{"token" => support_token}
) )
support_location = redirected_to(support_conn) support_location = redirected_to(support_conn)
@ -208,11 +235,25 @@ defmodule WhoNeedHelpWeb.SupportControllerTest do
"accurate_complete" => "true" "accurate_complete" => "true"
}) })
removal_conn = removal_token = WhoNeedHelp.ContentRemoval.confirmation_token(removal_notice)
removal_page =
conn conn
|> recycle() |> recycle()
|> get( |> get(~p"/legal/content-removal/#{removal_notice.id}/verify?token=#{removal_token}")
~p"/legal/content-removal/#{removal_notice.id}/verify?token=#{WhoNeedHelp.ContentRemoval.confirmation_token(removal_notice)}"
removal_html = html_response(removal_page, 200)
assert removal_html =~ "Confirm content-removal notice"
assert removal_html =~ ~s(id="content-removal-confirmation-fragment-form")
assert removal_html =~ ~s(id="content-removal-confirmation-fragment-token")
refute removal_html =~ removal_token
refute Repo.get!(WhoNeedHelp.ContentRemoval.Notice, removal_notice.id).contact_verified_at
removal_conn =
post(
recycle(removal_page),
~p"/legal/content-removal/#{removal_notice.id}/verify",
%{"token" => removal_token}
) )
removal_location = redirected_to(removal_conn) removal_location = redirected_to(removal_conn)