Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
pleroma
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
freon
pleroma
Commits
f9fe6a9e
Verified
Commit
f9fe6a9e
authored
5 years ago
by
Haelwenn
Browse files
Options
Downloads
Patches
Plain Diff
Captcha: return invalid when answer_data is nil
parent
ee57663d
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
lib/pleroma/captcha/captcha.ex
+5
-4
5 additions, 4 deletions
lib/pleroma/captcha/captcha.ex
test/captcha_test.exs
+52
-1
52 additions, 1 deletion
test/captcha_test.exs
test/support/captcha_mock.ex
+12
-3
12 additions, 3 deletions
test/support/captcha_mock.ex
with
69 additions
and
8 deletions
lib/pleroma/captcha/captcha.ex
+
5
−
4
View file @
f9fe6a9e
# Pleroma: A lightweight social networking server
# Copyright © 2017-20
19
Pleroma Authors <https://pleroma.social/>
# Copyright © 2017-20
20
Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule
Pleroma
.
Captcha
do
...
...
@@ -50,7 +50,7 @@ def handle_call(:new, _from, state) do
token
=
new_captcha
[
:token
]
secret
=
KeyGenerator
.
generate
(
secret_key_base
,
token
<>
"_encrypt"
)
sign_secret
=
KeyGenerator
.
generate
(
secret_key_base
,
token
<>
"_sign"
)
# Basicall
t
y copy what Phoenix.Token does here, add the time to
# Basically copy what Phoenix.Token does here, add the time to
# the actual data and make it a binary to then encrypt it
encrypted_captcha_answer
=
%{
...
...
@@ -62,7 +62,7 @@ def handle_call(:new, _from, state) do
{
:reply
,
# Rep
a
lce the answer with the encrypted answer
# Repl
a
ce the answer with the encrypted answer
%{
new_captcha
|
answer_data:
encrypted_captcha_answer
},
state
}
...
...
@@ -82,7 +82,8 @@ def handle_call({:validate, token, captcha, answer_data}, _from, state) do
valid_if_after
=
DateTime
.
subtract!
(
DateTime
.
now_utc
(),
seconds_valid
)
result
=
with
{
:ok
,
data
}
<-
MessageEncryptor
.
decrypt
(
answer_data
,
secret
,
sign_secret
),
with
false
<-
is_nil
(
answer_data
),
{
:ok
,
data
}
<-
MessageEncryptor
.
decrypt
(
answer_data
,
secret
,
sign_secret
),
%{
at:
at
,
answer_data:
answer_md5
}
<-
:erlang
.
binary_to_term
(
data
)
do
try
do
if
DateTime
.
before?
(
at
,
valid_if_after
),
...
...
This diff is collapsed.
Click to expand it.
test/captcha_test.exs
+
52
−
1
View file @
f9fe6a9e
...
...
@@ -3,15 +3,18 @@
# SPDX-License-Identifier: AGPL-3.0-only
defmodule
Pleroma
.
CaptchaTest
do
use
ExUnit
.
Case
use
Pleroma
.
Data
Case
import
Tesla
.
Mock
alias
Pleroma
.
Captcha
alias
Pleroma
.
Captcha
.
Kocaptcha
alias
Pleroma
.
Captcha
.
Native
@ets_options
[
:ordered_set
,
:private
,
:named_table
,
{
:read_concurrency
,
true
}]
clear_config
([
Pleroma
.
Captcha
,
:enabled
])
describe
"Kocaptcha"
do
setup
do
ets_name
=
Kocaptcha
.
Ets
...
...
@@ -62,4 +65,52 @@ test "new and validate" do
assert
{
:error
,
"Invalid CAPTCHA"
}
==
Native
.
validate
(
token
,
answer
,
answer
<>
"foobar"
)
end
end
describe
"Captcha Wrapper"
do
test
"validate"
do
Pleroma
.
Config
.
put
([
Pleroma
.
Captcha
,
:enabled
],
true
)
new
=
Captcha
.
new
()
assert
%{
answer_data:
answer
,
token:
token
}
=
new
assert
is_binary
(
answer
)
assert
:ok
=
Captcha
.
validate
(
token
,
"63615261b77f5354fb8c4e4986477555"
,
answer
)
end
test
"doesn't validate invalid answer"
do
Pleroma
.
Config
.
put
([
Pleroma
.
Captcha
,
:enabled
],
true
)
new
=
Captcha
.
new
()
assert
%{
answer_data:
answer
,
token:
token
}
=
new
assert
is_binary
(
answer
)
assert
{
:error
,
"Invalid answer data"
}
=
Captcha
.
validate
(
token
,
"63615261b77f5354fb8c4e4986477555"
,
answer
<>
"foobar"
)
end
test
"nil answer_data"
do
Pleroma
.
Config
.
put
([
Pleroma
.
Captcha
,
:enabled
],
true
)
new
=
Captcha
.
new
()
assert
%{
answer_data:
answer
,
token:
token
}
=
new
assert
is_binary
(
answer
)
assert
{
:error
,
"Invalid answer data"
}
=
Captcha
.
validate
(
token
,
"63615261b77f5354fb8c4e4986477555"
,
nil
)
end
end
end
This diff is collapsed.
Click to expand it.
test/support/captcha_mock.ex
+
12
−
3
View file @
f9fe6a9e
# Pleroma: A lightweight social networking server
# Copyright © 2017-20
19
Pleroma Authors <https://pleroma.social/>
# Copyright © 2017-20
20
Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule
Pleroma
.
Captcha
.
Mock
do
...
...
@@ -7,8 +7,17 @@ defmodule Pleroma.Captcha.Mock do
@behaviour
Service
@impl
Service
def
new
,
do
:
%{
type:
:mock
}
def
new
,
do
:
%{
type:
:mock
,
token:
"afa1815e14e29355e6c8f6b143a39fa2"
,
answer_data:
"63615261b77f5354fb8c4e4986477555"
,
url:
"https://example.org/captcha.png"
}
@impl
Service
def
validate
(
_token
,
_captcha
,
_data
),
do
:
:ok
def
validate
(
_token
,
captcha
,
captcha
)
when
not
is_nil
(
captcha
),
do
:
:ok
def
validate
(
_token
,
captcha
,
answer
),
do
:
{
:error
,
"Invalid CAPTCHA captcha:
#{
inspect
(
captcha
)
}
; answer:
#{
inspect
(
answer
)
}
"
}
end
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment